[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: kdemultimedia/akode/plugins/alsa_sink
From: Allan Sandfeld Jensen <kde () carewolf ! com>
Date: 2005-01-09 15:43:13
Message-ID: 20050109154313.448021CF30 () office ! kde ! org
[Download RAW message or body]
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;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic