From kde-commits Sun Jan 09 15:43:13 2005 From: Allan Sandfeld Jensen Date: Sun, 09 Jan 2005 15:43:13 +0000 To: kde-commits Subject: kdemultimedia/akode/plugins/alsa_sink Message-Id: <20050109154313.448021CF30 () office ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=110528540127804 CVS commit by carewolf: Adapt better to format limitations M +40 -41 alsa_sink.cpp 1.11 --- kdemultimedia/akode/plugins/alsa_sink/alsa_sink.cpp #1.10:1.11 @@ -99,53 +99,53 @@ int ALSASink::setAudioConfiguration(cons snd_pcm_hw_params_any(m_data->pcm_playback, hw); snd_pcm_hw_params_set_access(m_data->pcm_playback, hw, SND_PCM_ACCESS_RW_INTERLEAVED); - //snd_pcm_hw_params_test_format( SND_PCM_FORMAT_S16_LE); - if (config->sample_width<0) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_FLOAT); + // Detect format: + snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN; + // Test for float, 24 and 32 bit integer. Fall back to 16bit + if (m_data->config.sample_width<0) { + if (snd_pcm_hw_params_test_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_FLOAT ) == 0) { + format = SND_PCM_FORMAT_FLOAT; m_data->scale = 1; + goto found_format; } - else - if (config->sample_width<=8) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S8); - m_data->scale = 1<<(8-config->sample_width); - } - else - if (config->sample_width<=16) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S16); - m_data->scale = 1<<(16-config->sample_width); - } - else - if (config->sample_width <=24) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S24); - m_data->scale = 1<<(24-config->sample_width); + // Try 16bit then + m_data->config.sample_width = 16; } - else - if (config->sample_width <=32) { + if (m_data->config.sample_width > 24 && m_data->config.sample_width <=32) { if (snd_pcm_hw_params_test_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S32) == 0) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S32); + format = SND_PCM_FORMAT_S32; m_data->scale = 1<<(32-config->sample_width); + goto found_format; } - else - if (snd_pcm_hw_params_test_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S24) == 0) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S24); + // Try 24bit then m_data->config.sample_width = 24; - m_data->scale = 1; } - else - if (snd_pcm_hw_params_test_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S16) == 0) { - snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S16); + if (m_data->config.sample_width > 16 && m_data->config.sample_width <= 24) { + if (snd_pcm_hw_params_test_format(m_data->pcm_playback, hw, SND_PCM_FORMAT_S24 ) == 0) { + format = SND_PCM_FORMAT_S24; + m_data->scale = 1<<(24-config->sample_width); + goto found_format; + } + // Try 16bit then m_data->config.sample_width = 16; - m_data->scale = 1; } - else - res = -1; + // If the driver doesnt support 8 or 16 bit, we will fail completly + if (m_data->config.sample_width<=8) { + format = SND_PCM_FORMAT_S8; + m_data->scale = 1<<(8-config->sample_width); + goto found_format; } else - res = -1; - - if (res < 0) { - m_data->error = true; - return res; + if (m_data->config.sample_width<=16) { + format = SND_PCM_FORMAT_S16; + m_data->scale = 1<<(16-config->sample_width); + goto found_format; } +found_format: + if (format != SND_PCM_FORMAT_UNKNOWN) + snd_pcm_hw_params_set_format(m_data->pcm_playback, hw, format); + else + return -1; + unsigned int rate = config->sample_rate; snd_pcm_hw_params_set_rate_near(m_data->pcm_playback, hw, &rate, 0); @@ -160,5 +160,4 @@ int ALSASink::setAudioConfiguration(cons if (snd_pcm_hw_params(m_data->pcm_playback, hw) < 0) { - m_data->error = true; return -1; }