Author: adrian
Date: Sat Jan 14 03:55:55 2012
New Revision: 9571

URL: http://svn.slimdevices.com/jive?rev=9571&view=rev
Log:
Bug: N/A
Description: support S24_3LE as well as S24_LE alsa sample format to allow 
native support of devices such as usb dacs which use S24_3LE

Modified:
    7.7/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c

Modified: 
7.7/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c
URL: 
http://svn.slimdevices.com/jive/7.7/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c?rev=9571&r1=9570&r2=9571&view=diff
==============================================================================
--- 
7.7/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c 
(original)
+++ 
7.7/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c 
Sat Jan 14 03:55:55 2012
@@ -427,17 +427,38 @@
                }
 
                if (PCM_SAMPLE_WIDTH() == 24) {
-                       sample_t *decode_ptr;
-                       Sint32 *output_ptr;
-
-                       output_ptr = (Sint32 *)(void *)output_buffer;
-                       decode_ptr = (sample_t *)(void *)(decode_fifo_buf + 
decode_audio->fifo.rptr);
-                       while (frames_cnt--) {
-                               *(output_ptr++) = fixed_mul(lgain, 
*(decode_ptr++)) >> 8;
-                               *(output_ptr++) = fixed_mul(rgain, 
*(decode_ptr++)) >> 8;
+                       if (state->format == SND_PCM_FORMAT_S24_LE) {
+                               /* handle SND_PCM_FORMAT_S24_LE case */
+                               sample_t *decode_ptr;
+                               Sint32 *output_ptr;
+                               
+                               output_ptr = (Sint32 *)(void *)output_buffer;
+                               decode_ptr = (sample_t *)(void 
*)(decode_fifo_buf + decode_audio->fifo.rptr);
+                               while (frames_cnt--) {
+                                       *(output_ptr++) = fixed_mul(lgain, 
*(decode_ptr++)) >> 8;
+                                       *(output_ptr++) = fixed_mul(rgain, 
*(decode_ptr++)) >> 8;
+                               }
+                       } else {
+                               /* handle SND_PCM_FORMAT_S24_3LE case */
+                               sample_t *decode_ptr;
+                               u8_t *output_ptr;
+                               
+                               output_ptr = (u8_t *)(void *)output_buffer;
+                               decode_ptr = (sample_t *)(void 
*)(decode_fifo_buf + decode_audio->fifo.rptr);
+                               while (frames_cnt--) {
+                                       sample_t lsample = fixed_mul(lgain, 
*(decode_ptr++));
+                                       sample_t rsample = fixed_mul(rgain, 
*(decode_ptr++));
+                                       *(output_ptr++) = (lsample & 
0x0000ff00) >>  8;
+                                       *(output_ptr++) = (lsample & 
0x00ff0000) >> 16;
+                                       *(output_ptr++) = (lsample & 
0xff000000) >> 24;
+                                       *(output_ptr++) = (rsample & 
0x0000ff00) >>  8;
+                                       *(output_ptr++) = (rsample & 
0x00ff0000) >> 16;
+                                       *(output_ptr++) = (rsample & 
0xff000000) >> 24;
+                               }
                        }
                }
                else {
+                       /* handle SND_PCM_FORMAT_S16_LE case */
                        sample_t *decode_ptr;
                        Sint16 *output_ptr;
 
@@ -576,8 +597,18 @@
 
        /* set the sample format */
        if ((err = snd_pcm_hw_params_set_format(*pcmp, hw_params, 
state->format)) < 0) {
-               LOG_ERROR("Sample format not available: %s", snd_strerror(err));
-               return err;
+
+               /* for 24bit try S24_LE and S24_3LE */
+               if (state->format == SND_PCM_FORMAT_S24_LE) {
+                       state->format = SND_PCM_FORMAT_S24_3LE;
+                       LOG_INFO("S24_LE unavailable trying S24_3LE");
+                       err = snd_pcm_hw_params_set_format(*pcmp, hw_params, 
state->format);
+               }
+
+               if (err < 0) {
+                       LOG_ERROR("Sample format not available: %s", 
snd_strerror(err));
+                       return err;
+               }
        }
 
        /* set the channel count */

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins

Reply via email to