Commit dbd79a6b authored by Warren Dukes's avatar Warren Dukes

fix a few bugs in mp3_decode and minimize alsa underruns by playing silence when switch songs

git-svn-id: https://svn.musicpd.org/mpd/trunk@1572 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 7f155366
...@@ -278,6 +278,11 @@ int playAudio(char * playChunk, int size) { ...@@ -278,6 +278,11 @@ int playAudio(char * playChunk, int size) {
return 0; return 0;
} }
int isAudioDeviceOpen() {
if(audio_device) return 1;
return 0;
}
void closeAudioDevice() { void closeAudioDevice() {
#ifdef HAVE_AUDIO #ifdef HAVE_AUDIO
if(audio_device) { if(audio_device) {
......
...@@ -49,6 +49,8 @@ int playAudio(char * playChunk,int size); ...@@ -49,6 +49,8 @@ int playAudio(char * playChunk,int size);
void closeAudioDevice(); void closeAudioDevice();
int isAudioDeviceOpen();
void audioError(); void audioError();
int isCurrentAudioFormat(AudioFormat * audioFormat); int isCurrentAudioFormat(AudioFormat * audioFormat);
......
...@@ -98,6 +98,12 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) { ...@@ -98,6 +98,12 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
return (int)chunks; return (int)chunks;
} }
#define playSilenceOrSleep() \
if(isAudioDeviceOpen()) { \
playAudio(silence, CHUNK_SIZE); \
} \
else my_usleep(10000);
#define handleDecodeStart() \ #define handleDecodeStart() \
if(decodeWaitedOn) { \ if(decodeWaitedOn) { \
if(dc->state!=DECODE_STATE_START && *decode_pid > 0 && \ if(dc->state!=DECODE_STATE_START && *decode_pid > 0 && \
...@@ -128,7 +134,7 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) { ...@@ -128,7 +134,7 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
return; \ return; \
} \ } \
else { \ else { \
my_usleep(10000); \ my_usleep(10000); \
continue; \ continue; \
} \ } \
} }
...@@ -462,9 +468,8 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) { ...@@ -462,9 +468,8 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
dc->state!=DECODE_STATE_STOP) dc->state!=DECODE_STATE_STOP)
{ {
processDecodeInput(); processDecodeInput();
handleDecodeStart();
if(quit) return; if(quit) return;
my_usleep(10000); playSilenceOrSleep();
} }
while(!quit) { while(!quit) {
......
...@@ -575,12 +575,12 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) { ...@@ -575,12 +575,12 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
MP3_DATA_OUTPUT_BUFFER_SIZE, MP3_DATA_OUTPUT_BUFFER_SIZE,
data->elapsedTime, data->elapsedTime,
data->bitRate/1000); data->bitRate/1000);
data->outputPtr = data->outputBuffer;
if(ret == OUTPUT_BUFFER_DC_STOP) { if(ret == OUTPUT_BUFFER_DC_STOP) {
return DECODE_BREAK; return DECODE_BREAK;
} }
data->outputPtr = data->outputBuffer;
if(ret == OUTPUT_BUFFER_DC_SEEK) break; if(ret == OUTPUT_BUFFER_DC_SEEK) break;
} }
} }
...@@ -640,7 +640,7 @@ void initAudioFormatFromMp3DecodeData(mp3DecodeData * data, AudioFormat * af) { ...@@ -640,7 +640,7 @@ void initAudioFormatFromMp3DecodeData(mp3DecodeData * data, AudioFormat * af) {
int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) {
mp3DecodeData data; mp3DecodeData data;
MpdTag * tag; MpdTag * tag = NULL;
if(openMp3FromInputStream(inStream, &data, dc, &tag) < 0) { if(openMp3FromInputStream(inStream, &data, dc, &tag) < 0) {
closeInputStream(inStream); closeInputStream(inStream);
...@@ -664,7 +664,6 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { ...@@ -664,7 +664,6 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) {
if(tag) freeMpdTag(tag); if(tag) freeMpdTag(tag);
tag = newMpdTag(); tag = newMpdTag();
tag->title = strdup(inStream->metaTitle); tag->title = strdup(inStream->metaTitle);
/* free ths now, so we know we are done with it */
free(inStream->metaTitle); free(inStream->metaTitle);
inStream->metaTitle = NULL; inStream->metaTitle = NULL;
if(inStream->metaName) { if(inStream->metaName) {
...@@ -694,7 +693,7 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { ...@@ -694,7 +693,7 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) {
while(mp3Read(&data,cb,dc)!=DECODE_BREAK); while(mp3Read(&data,cb,dc)!=DECODE_BREAK);
/* send last little bit if not dc->stop */ /* send last little bit if not dc->stop */
if(data.outputPtr!=data.outputBuffer && data.flush) { if(!dc->stop && data.outputPtr!=data.outputBuffer && data.flush) {
sendDataToOutputBuffer(cb, NULL, dc, sendDataToOutputBuffer(cb, NULL, dc,
data.inStream->seekable, data.inStream->seekable,
data.outputBuffer, data.outputBuffer,
......
...@@ -321,9 +321,8 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) ...@@ -321,9 +321,8 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream)
ov_pcm_tell(&vf)/ ov_pcm_tell(&vf)/
dc->audioFormat.sampleRate, dc->audioFormat.sampleRate,
bitRate); bitRate);
if(dc->stop) break;
chunkpos = 0; chunkpos = 0;
if(dc->stop) break;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment