From b5e55a648f12cea229f49c00730ef11a8583b66b Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Tue, 8 Mar 2005 01:53:13 +0000 Subject: we ne allow audioOutput plugins to set the final outAudioFormat that will be used. we now use alsa's _near functions to detect what to use. git-svn-id: https://svn.musicpd.org/mpd/trunk@3038 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/audioOutput.c | 25 ++++++++++++++++--------- src/audioOutput.h | 1 + src/audioOutputs/audioOutput_alsa.c | 14 ++++++++++---- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/audioOutput.c b/src/audioOutput.c index c973e1beb..1186dbe0d 100644 --- a/src/audioOutput.c +++ b/src/audioOutput.c @@ -73,13 +73,14 @@ AudioOutput * newAudioOutput(ConfigParam * param) { memset(&ret->inAudioFormat, 0, sizeof(AudioFormat)); memset(&ret->outAudioFormat, 0, sizeof(AudioFormat)); + memset(&ret->reqAudioFormat, 0, sizeof(AudioFormat)); getBlockParam(AUDIO_OUTPUT_FORMAT, format, 0); if(format) { ret->convertAudioFormat = 1; - if(0 != parseAudioConfig(&ret->outAudioFormat, format)) + if(0 != parseAudioConfig(&ret->reqAudioFormat, format)) { ERROR("error parsing format at line %i\n", bp->line); @@ -102,6 +103,8 @@ AudioOutput * newAudioOutput(ConfigParam * param) { } int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat) { + int ret; + if(audioOutput->open) { if(cmpAudioFormat(audioFormat, &audioOutput->inAudioFormat) == 0) @@ -114,20 +117,24 @@ int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat) { copyAudioFormat(&audioOutput->inAudioFormat, audioFormat); if(audioOutput->convertAudioFormat) { - if(cmpAudioFormat(&audioOutput->inAudioFormat, - &audioOutput->outAudioFormat) == 0) - { - audioOutput->sameInAndOutFormats = 1; - } - else audioOutput->sameInAndOutFormats = 0; + copyAudioFormat(&audioOutput->outAudioFormat, + &audioOutput->reqAudioFormat); } else { - audioOutput->sameInAndOutFormats = 1; copyAudioFormat(&audioOutput->outAudioFormat, &audioOutput->inAudioFormat); } - return audioOutput->openDeviceFunc(audioOutput); + ret = audioOutput->openDeviceFunc(audioOutput); + + if(cmpAudioFormat(&audioOutput->inAudioFormat, + &audioOutput->outAudioFormat) == 0) + { + audioOutput->sameInAndOutFormats = 1; + } + else audioOutput->sameInAndOutFormats = 0; + + return ret; } static void convertAudioFormat(AudioOutput * audioOutput, char ** chunkArgPtr, diff --git a/src/audioOutput.h b/src/audioOutput.h index 13c549555..85868eaeb 100644 --- a/src/audioOutput.h +++ b/src/audioOutput.h @@ -60,6 +60,7 @@ struct _AudioOutput { int convertAudioFormat; AudioFormat inAudioFormat; AudioFormat outAudioFormat; + AudioFormat reqAudioFormat; char * convBuffer; int convBufferLen; int sameInAndOutFormats; diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c index 0cf453ffe..d804720b0 100644 --- a/src/audioOutputs/audioOutput_alsa.c +++ b/src/audioOutputs/audioOutput_alsa.c @@ -93,6 +93,7 @@ static int alsa_openDevice(AudioOutput * audioOutput) snd_pcm_hw_params_t * hwparams; snd_pcm_sw_params_t * swparams; unsigned int sampleRate = audioFormat->sampleRate; + unsigned int channels = audioFormat->channels; snd_pcm_uframes_t alsa_buffer_size; snd_pcm_uframes_t alsa_period_size; unsigned int alsa_buffer_time = MPD_ALSA_BUFFER_TIME; @@ -107,10 +108,10 @@ static int alsa_openDevice(AudioOutput * audioOutput) bitformat = SND_PCM_FORMAT_S16; break; case 24: - bitformat = SND_PCM_FORMAT_S16; + bitformat = SND_PCM_FORMAT_S24; break; case 32: - bitformat = SND_PCM_FORMAT_S16; + bitformat = SND_PCM_FORMAT_S32; break; default: ERROR("Alsa device \"%s\" doesn't support %i bit audio\n", @@ -162,14 +163,15 @@ static int alsa_openDevice(AudioOutput * audioOutput) goto fail; } - err = snd_pcm_hw_params_set_channels(ad->pcmHandle, hwparams, - audioFormat->channels); + err = snd_pcm_hw_params_set_channels_near(ad->pcmHandle, hwparams, + &channels); if(err < 0) { ERROR("Alsa device \"%s\" does not support %i channels: " "%s\n", ad->device, (int)audioFormat->channels, snd_strerror(-err)); goto fail; } + audioFormat->channels = channels; err = snd_pcm_hw_params_set_rate_near(ad->pcmHandle, hwparams, &sampleRate, 0); @@ -178,6 +180,7 @@ static int alsa_openDevice(AudioOutput * audioOutput) ad->device, (int)audioFormat->sampleRate); goto fail; } + audioFormat->sampleRate = sampleRate; err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams, &alsa_buffer_time, 0); @@ -214,6 +217,9 @@ static int alsa_openDevice(AudioOutput * audioOutput) audioOutput->open = 1; + DEBUG("alsa device \"%s\" will be playing %i channel audio at %i Hz\n", + ad->device, channels, sampleRate); + return 0; error: -- cgit v1.2.3