mirror of
https://github.com/SerenityOS/serenity
synced 2024-10-16 04:42:57 +00:00
parent
d7b067e8f7
commit
37b5bfa068
|
@ -13,16 +13,14 @@
|
|||
#include <AudioServer/ConnectionFromClient.h>
|
||||
#include <AudioServer/Mixer.h>
|
||||
#include <LibCore/ConfigFile.h>
|
||||
#include <LibCore/DeprecatedFile.h>
|
||||
#include <LibCore/Timer.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
namespace AudioServer {
|
||||
|
||||
Mixer::Mixer(NonnullRefPtr<Core::ConfigFile> config)
|
||||
// FIXME: Allow AudioServer to use other audio channels as well
|
||||
: m_device(Core::DeprecatedFile::construct("/dev/audio/0", this))
|
||||
Mixer::Mixer(NonnullRefPtr<Core::ConfigFile> config, NonnullOwnPtr<Core::File> device)
|
||||
: m_device(move(device))
|
||||
, m_sound_thread(Threading::Thread::construct(
|
||||
[this] {
|
||||
mix();
|
||||
|
@ -31,11 +29,6 @@ Mixer::Mixer(NonnullRefPtr<Core::ConfigFile> config)
|
|||
"AudioServer[mixer]"sv))
|
||||
, m_config(move(config))
|
||||
{
|
||||
if (!m_device->open(Core::OpenMode::WriteOnly)) {
|
||||
dbgln("Can't open audio device: {}", m_device->error_string());
|
||||
return;
|
||||
}
|
||||
|
||||
m_muted = m_config->read_bool_entry("Master", "Mute", false);
|
||||
m_main_volume = static_cast<double>(m_config->read_num_entry("Master", "Volume", 100)) / 100.0;
|
||||
|
||||
|
@ -98,7 +91,7 @@ void Mixer::mix()
|
|||
|
||||
// Even though it's not realistic, the user expects no sound at 0%.
|
||||
if (m_muted || m_main_volume < 0.01) {
|
||||
m_device->write(m_zero_filled_buffer.data(), static_cast<int>(m_zero_filled_buffer.size()));
|
||||
m_device->write_until_depleted(m_zero_filled_buffer).release_value_but_fixme_should_propagate_errors();
|
||||
} else {
|
||||
FixedMemoryStream stream { m_stream_buffer.span() };
|
||||
|
||||
|
@ -116,7 +109,8 @@ void Mixer::mix()
|
|||
|
||||
auto buffered_bytes = MUST(stream.tell());
|
||||
VERIFY(buffered_bytes == m_stream_buffer.size());
|
||||
m_device->write(m_stream_buffer.data(), static_cast<int>(buffered_bytes));
|
||||
m_device->write_until_depleted({ m_stream_buffer.data(), buffered_bytes })
|
||||
.release_value_but_fixme_should_propagate_errors();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
#include <AK/RefCounted.h>
|
||||
#include <AK/WeakPtr.h>
|
||||
#include <LibAudio/Queue.h>
|
||||
#include <LibCore/ConfigFile.h>
|
||||
#include <LibCore/File.h>
|
||||
#include <LibCore/Timer.h>
|
||||
#include <LibThreading/ConditionVariable.h>
|
||||
#include <LibThreading/Mutex.h>
|
||||
|
@ -102,8 +104,15 @@ private:
|
|||
};
|
||||
|
||||
class Mixer : public Core::Object {
|
||||
C_OBJECT(Mixer)
|
||||
C_OBJECT_ABSTRACT(Mixer)
|
||||
public:
|
||||
static ErrorOr<NonnullRefPtr<Mixer>> try_create(NonnullRefPtr<Core::ConfigFile> config)
|
||||
{
|
||||
// FIXME: Allow AudioServer to use other audio channels as well
|
||||
auto device = TRY(Core::File::open("/dev/audio/0"sv, Core::File::OpenMode::Write));
|
||||
return adopt_nonnull_ref_or_enomem(new (nothrow) Mixer(move(config), move(device)));
|
||||
}
|
||||
|
||||
virtual ~Mixer() override = default;
|
||||
|
||||
NonnullRefPtr<ClientAudioStream> create_queue(ConnectionFromClient&);
|
||||
|
@ -119,7 +128,7 @@ public:
|
|||
u32 audiodevice_get_sample_rate() const;
|
||||
|
||||
private:
|
||||
Mixer(NonnullRefPtr<Core::ConfigFile> config);
|
||||
Mixer(NonnullRefPtr<Core::ConfigFile> config, NonnullOwnPtr<Core::File> device);
|
||||
|
||||
void request_setting_sync();
|
||||
|
||||
|
@ -127,7 +136,7 @@ private:
|
|||
Threading::Mutex m_pending_mutex;
|
||||
Threading::ConditionVariable m_mixing_necessary { m_pending_mutex };
|
||||
|
||||
RefPtr<Core::DeprecatedFile> m_device;
|
||||
NonnullOwnPtr<Core::File> m_device;
|
||||
|
||||
NonnullRefPtr<Threading::Thread> m_sound_thread;
|
||||
|
||||
|
|
Loading…
Reference in a new issue