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
This commit is contained in:
parent
7f15536683
commit
dbd79a6b47
@ -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);
|
|||||||
|
|
||||||
void closeAudioDevice();
|
void closeAudioDevice();
|
||||||
|
|
||||||
|
int isAudioDeviceOpen();
|
||||||
|
|
||||||
void audioError();
|
void audioError();
|
||||||
|
|
||||||
int isCurrentAudioFormat(AudioFormat * audioFormat);
|
int isCurrentAudioFormat(AudioFormat * audioFormat);
|
||||||
|
11
src/decode.c
11
src/decode.c
@ -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) {
|
|||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
else { \
|
else { \
|
||||||
my_usleep(10000); \
|
my_usleep(10000); \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
@ -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) {
|
|||||||
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) {
|
|||||||
|
|
||||||
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) {
|
|||||||
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) {
|
|||||||
|
|
||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user