aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWarren Dukes <warren.dukes@gmail.com>2004-06-19 22:27:29 +0000
committerWarren Dukes <warren.dukes@gmail.com>2004-06-19 22:27:29 +0000
commitdbd79a6b47d1cf09f3ccc8df5ef1a8e1dfedd853 (patch)
treeefa08ce06db6b210c91d8f2bf82d21a89975efa2
parent7f1553668329eb155629ef5a07b9161a26267d80 (diff)
downloadmpd-dbd79a6b47d1cf09f3ccc8df5ef1a8e1dfedd853.tar.gz
mpd-dbd79a6b47d1cf09f3ccc8df5ef1a8e1dfedd853.tar.xz
mpd-dbd79a6b47d1cf09f3ccc8df5ef1a8e1dfedd853.zip
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
-rw-r--r--src/audio.c5
-rw-r--r--src/audio.h2
-rw-r--r--src/decode.c11
-rw-r--r--src/inputPlugins/mp3_plugin.c9
-rw-r--r--src/inputPlugins/ogg_plugin.c3
5 files changed, 20 insertions, 10 deletions
diff --git a/src/audio.c b/src/audio.c
index e677f8768..605bf796e 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -278,6 +278,11 @@ int playAudio(char * playChunk, int size) {
return 0;
}
+int isAudioDeviceOpen() {
+ if(audio_device) return 1;
+ return 0;
+}
+
void closeAudioDevice() {
#ifdef HAVE_AUDIO
if(audio_device) {
diff --git a/src/audio.h b/src/audio.h
index a03c42ca9..9b49b140e 100644
--- a/src/audio.h
+++ b/src/audio.h
@@ -49,6 +49,8 @@ int playAudio(char * playChunk,int size);
void closeAudioDevice();
+int isAudioDeviceOpen();
+
void audioError();
int isCurrentAudioFormat(AudioFormat * audioFormat);
diff --git a/src/decode.c b/src/decode.c
index b7ded74da..e81cddb76 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -98,6 +98,12 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
return (int)chunks;
}
+#define playSilenceOrSleep() \
+ if(isAudioDeviceOpen()) { \
+ playAudio(silence, CHUNK_SIZE); \
+ } \
+ else my_usleep(10000);
+
#define handleDecodeStart() \
if(decodeWaitedOn) { \
if(dc->state!=DECODE_STATE_START && *decode_pid > 0 && \
@@ -128,7 +134,7 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
return; \
} \
else { \
- my_usleep(10000); \
+ my_usleep(10000); \
continue; \
} \
}
@@ -462,9 +468,8 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
dc->state!=DECODE_STATE_STOP)
{
processDecodeInput();
- handleDecodeStart();
if(quit) return;
- my_usleep(10000);
+ playSilenceOrSleep();
}
while(!quit) {
diff --git a/src/inputPlugins/mp3_plugin.c b/src/inputPlugins/mp3_plugin.c
index 9c5eb824a..ef82c7122 100644
--- a/src/inputPlugins/mp3_plugin.c
+++ b/src/inputPlugins/mp3_plugin.c
@@ -575,12 +575,12 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
MP3_DATA_OUTPUT_BUFFER_SIZE,
data->elapsedTime,
data->bitRate/1000);
+ data->outputPtr = data->outputBuffer;
+
if(ret == OUTPUT_BUFFER_DC_STOP) {
return DECODE_BREAK;
}
- data->outputPtr = data->outputBuffer;
-
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) {
mp3DecodeData data;
- MpdTag * tag;
+ MpdTag * tag = NULL;
if(openMp3FromInputStream(inStream, &data, dc, &tag) < 0) {
closeInputStream(inStream);
@@ -664,7 +664,6 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) {
if(tag) freeMpdTag(tag);
tag = newMpdTag();
tag->title = strdup(inStream->metaTitle);
- /* free ths now, so we know we are done with it */
free(inStream->metaTitle);
inStream->metaTitle = NULL;
if(inStream->metaName) {
@@ -694,7 +693,7 @@ int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) {
while(mp3Read(&data,cb,dc)!=DECODE_BREAK);
/* 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,
data.inStream->seekable,
data.outputBuffer,
diff --git a/src/inputPlugins/ogg_plugin.c b/src/inputPlugins/ogg_plugin.c
index b50ea5ea1..adf11cf69 100644
--- a/src/inputPlugins/ogg_plugin.c
+++ b/src/inputPlugins/ogg_plugin.c
@@ -321,9 +321,8 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream)
ov_pcm_tell(&vf)/
dc->audioFormat.sampleRate,
bitRate);
-
- if(dc->stop) break;
chunkpos = 0;
+ if(dc->stop) break;
}
}