[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