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