mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-18 18:25:45 -04:00
AudioStream: Replace buffer queue with ring buffer
Should achieve a decent overall minimum latency reduction.
This commit is contained in:
@ -61,20 +61,18 @@ void HostInterface::Shutdown() {}
|
||||
|
||||
void HostInterface::CreateAudioStream()
|
||||
{
|
||||
Log_InfoPrintf("Creating '%s' audio stream, sample rate = %u, channels = %u, buffer size = %u, buffer count = %u",
|
||||
Log_InfoPrintf("Creating '%s' audio stream, sample rate = %u, channels = %u, buffer size = %u",
|
||||
Settings::GetAudioBackendName(m_settings.audio_backend), AUDIO_SAMPLE_RATE, AUDIO_CHANNELS,
|
||||
m_settings.audio_buffer_size, m_settings.audio_buffer_count);
|
||||
m_settings.audio_buffer_size);
|
||||
|
||||
m_audio_stream = CreateAudioStream(m_settings.audio_backend);
|
||||
|
||||
if (!m_audio_stream || !m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, m_settings.audio_buffer_size,
|
||||
m_settings.audio_buffer_count))
|
||||
if (!m_audio_stream || !m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, m_settings.audio_buffer_size))
|
||||
{
|
||||
ReportFormattedError("Failed to create or configure audio stream, falling back to null output.");
|
||||
m_audio_stream.reset();
|
||||
m_audio_stream = AudioStream::CreateNullAudioStream();
|
||||
m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, m_settings.audio_buffer_size,
|
||||
m_settings.audio_buffer_count);
|
||||
m_audio_stream->Reconfigure(AUDIO_SAMPLE_RATE, AUDIO_CHANNELS, m_settings.audio_buffer_size);
|
||||
}
|
||||
|
||||
m_audio_stream->SetOutputVolume(m_settings.audio_output_muted ? 0 : m_settings.audio_output_volume);
|
||||
@ -1011,7 +1009,6 @@ void HostInterface::SetDefaultSettings(SettingsInterface& si)
|
||||
si.SetStringValue("Audio", "Backend", Settings::GetAudioBackendName(AudioBackend::Cubeb));
|
||||
si.SetIntValue("Audio", "OutputVolume", 100);
|
||||
si.SetIntValue("Audio", "BufferSize", DEFAULT_AUDIO_BUFFER_SIZE);
|
||||
si.SetIntValue("Audio", "BufferCount", DEFAULT_AUDIO_BUFFER_COUNT);
|
||||
si.SetIntValue("Audio", "OutputMuted", false);
|
||||
si.SetBoolValue("Audio", "Sync", true);
|
||||
si.SetBoolValue("Audio", "DumpOnBoot", false);
|
||||
@ -1072,8 +1069,7 @@ void HostInterface::UpdateSettings(SettingsInterface& si)
|
||||
}
|
||||
|
||||
if (m_settings.audio_backend != old_settings.audio_backend ||
|
||||
m_settings.audio_buffer_size != old_settings.audio_buffer_size ||
|
||||
m_settings.audio_buffer_count != old_settings.audio_buffer_count)
|
||||
m_settings.audio_buffer_size != old_settings.audio_buffer_size)
|
||||
{
|
||||
if (m_settings.audio_backend != old_settings.audio_backend)
|
||||
ReportFormattedMessage("Switching to %s audio backend.",
|
||||
|
@ -38,8 +38,7 @@ public:
|
||||
{
|
||||
AUDIO_SAMPLE_RATE = 44100,
|
||||
AUDIO_CHANNELS = 2,
|
||||
DEFAULT_AUDIO_BUFFER_SIZE = 2048,
|
||||
DEFAULT_AUDIO_BUFFER_COUNT = 4
|
||||
DEFAULT_AUDIO_BUFFER_SIZE = 2048
|
||||
};
|
||||
|
||||
struct SaveStateInfo
|
||||
|
@ -61,7 +61,6 @@ void Settings::Load(SettingsInterface& si)
|
||||
ParseAudioBackend(si.GetStringValue("Audio", "Backend", "Cubeb").c_str()).value_or(AudioBackend::Cubeb);
|
||||
audio_output_volume = si.GetIntValue("Audio", "OutputVolume", 100);
|
||||
audio_buffer_size = si.GetIntValue("Audio", "BufferSize", HostInterface::DEFAULT_AUDIO_BUFFER_SIZE);
|
||||
audio_buffer_count = si.GetIntValue("Audio", "BufferCount", HostInterface::DEFAULT_AUDIO_BUFFER_COUNT);
|
||||
audio_output_muted = si.GetBoolValue("Audio", "OutputMuted", false);
|
||||
audio_sync_enabled = si.GetBoolValue("Audio", "Sync", true);
|
||||
audio_dump_on_boot = si.GetBoolValue("Audio", "DumpOnBoot", false);
|
||||
@ -151,7 +150,6 @@ void Settings::Save(SettingsInterface& si) const
|
||||
si.SetStringValue("Audio", "Backend", GetAudioBackendName(audio_backend));
|
||||
si.SetIntValue("Audio", "OutputVolume", audio_output_volume);
|
||||
si.SetIntValue("Audio", "BufferSize", audio_buffer_size);
|
||||
si.SetIntValue("Audio", "BufferCount", audio_buffer_count);
|
||||
si.SetBoolValue("Audio", "OutputMuted", audio_output_muted);
|
||||
si.SetBoolValue("Audio", "Sync", audio_sync_enabled);
|
||||
si.SetBoolValue("Audio", "DumpOnBoot", audio_dump_on_boot);
|
||||
|
@ -71,7 +71,6 @@ struct Settings
|
||||
AudioBackend audio_backend = AudioBackend::Cubeb;
|
||||
s32 audio_output_volume = 100;
|
||||
u32 audio_buffer_size = 2048;
|
||||
u32 audio_buffer_count = 4;
|
||||
bool audio_output_muted = false;
|
||||
bool audio_sync_enabled = true;
|
||||
bool audio_dump_on_boot = true;
|
||||
|
@ -674,7 +674,7 @@ void SPU::Execute(TickCount ticks)
|
||||
{
|
||||
AudioStream* const output_stream = m_system->GetHostInterface()->GetAudioStream();
|
||||
s16* output_frame_start;
|
||||
u32 output_frame_space;
|
||||
u32 output_frame_space = remaining_frames;
|
||||
output_stream->BeginWrite(&output_frame_start, &output_frame_space);
|
||||
|
||||
s16* output_frame = output_frame_start;
|
||||
|
Reference in New Issue
Block a user