aboutsummaryrefslogtreecommitdiffstats
path: root/src/decode.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/decode.c77
1 files changed, 35 insertions, 42 deletions
diff --git a/src/decode.c b/src/decode.c
index 3758ca27b..1e8700019 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -85,7 +85,7 @@ static unsigned calculateCrossFadeChunks(AudioFormat * af, float totalTime)
chunks = (af->sampleRate * af->bits * af->channels / 8.0 / CHUNK_SIZE);
chunks = (chunks * pc.crossFade + 0.5);
- buffered_chunks = getPlayerData()->buffer.size;
+ buffered_chunks = cb.size;
assert(buffered_chunks >= buffered_before_play);
if (chunks > (buffered_chunks - buffered_before_play))
chunks = buffered_chunks - buffered_before_play;
@@ -93,7 +93,7 @@ static unsigned calculateCrossFadeChunks(AudioFormat * af, float totalTime)
return chunks;
}
-static int waitOnDecode(OutputBuffer * cb, int *decodeWaitedOn)
+static int waitOnDecode(int *decodeWaitedOn)
{
while (dc.start)
player_wakeup_decoder();
@@ -115,7 +115,7 @@ static int waitOnDecode(OutputBuffer * cb, int *decodeWaitedOn)
return 0;
}
-static int decodeSeek(OutputBuffer * cb, int *decodeWaitedOn, int *next)
+static int decodeSeek(int *decodeWaitedOn, int *next)
{
int ret = -1;
@@ -124,10 +124,10 @@ static int decodeSeek(OutputBuffer * cb, int *decodeWaitedOn, int *next)
dc.current_song != pc.current_song) {
stopDecode();
*next = -1;
- clearOutputBuffer(cb);
+ clearOutputBuffer();
dc.error = DECODE_ERROR_NOERROR;
dc.start = 1;
- waitOnDecode(cb, decodeWaitedOn);
+ waitOnDecode(decodeWaitedOn);
}
if (dc.state != DECODE_STATE_STOP && dc.seekable) {
*next = -1;
@@ -148,8 +148,7 @@ static int decodeSeek(OutputBuffer * cb, int *decodeWaitedOn, int *next)
return ret;
}
-static void processDecodeInput(OutputBuffer * cb,
- int *pause_r, unsigned int *bbp_r,
+static void processDecodeInput(int *pause_r, unsigned int *bbp_r,
int *doCrossFade_r,
int *decodeWaitedOn_r,
int *next_r)
@@ -192,14 +191,14 @@ static void processDecodeInput(OutputBuffer * cb,
}
if(pc.seek) {
dropBufferedAudio();
- if (decodeSeek(cb, decodeWaitedOn_r, next_r) == 0) {
+ if (decodeSeek(decodeWaitedOn_r, next_r) == 0) {
*doCrossFade_r = 0;
*bbp_r = 0;
}
}
}
-static void decodeStart(OutputBuffer * cb)
+static void decodeStart(void)
{
int ret;
int close_instream = 1;
@@ -245,7 +244,7 @@ static void decodeStart(OutputBuffer * cb)
if (plugin->tryDecodeFunc
&& !plugin->tryDecodeFunc(&inStream))
continue;
- ret = plugin->streamDecodeFunc(cb, &inStream);
+ ret = plugin->streamDecodeFunc(&inStream);
break;
}
@@ -262,7 +261,7 @@ static void decodeStart(OutputBuffer * cb)
if (plugin->tryDecodeFunc &&
!plugin->tryDecodeFunc(&inStream))
continue;
- ret = plugin->streamDecodeFunc(cb, &inStream);
+ ret = plugin->streamDecodeFunc(&inStream);
break;
}
}
@@ -273,7 +272,7 @@ static void decodeStart(OutputBuffer * cb)
/* we already know our mp3Plugin supports streams, no
* need to check for stream{Types,DecodeFunc} */
if ((plugin = getInputPluginFromName("mp3"))) {
- ret = plugin->streamDecodeFunc(cb, &inStream);
+ ret = plugin->streamDecodeFunc(&inStream);
}
}
} else {
@@ -290,10 +289,10 @@ static void decodeStart(OutputBuffer * cb)
if (plugin->fileDecodeFunc) {
closeInputStream(&inStream);
close_instream = 0;
- ret = plugin->fileDecodeFunc(cb, path_max_fs);
+ ret = plugin->fileDecodeFunc(path_max_fs);
break;
} else if (plugin->streamDecodeFunc) {
- ret = plugin->streamDecodeFunc(cb, &inStream);
+ ret = plugin->streamDecodeFunc(&inStream);
break;
}
}
@@ -317,13 +316,11 @@ stop_no_close:
static void * decoder_task(mpd_unused void *arg)
{
- OutputBuffer *cb = &(getPlayerData()->buffer);
-
notifyEnter(&dc.notify);
while (1) {
if (dc.start || dc.seek) {
- decodeStart(cb);
+ decodeStart();
} else if (dc.stop) {
dc.state = DECODE_STATE_STOP;
dc.stop = 0;
@@ -381,7 +378,7 @@ static int playChunk(OutputBufferChunk * chunk,
return 0;
}
-static void decodeParent(OutputBuffer * cb)
+static void decodeParent(void)
{
int do_pause = 0;
int buffering = 1;
@@ -399,7 +396,7 @@ static void decodeParent(OutputBuffer * cb)
/** the position of the first chunk in the next song */
int next = -1;
- if (waitOnDecode(cb, &decodeWaitedOn) < 0)
+ if (waitOnDecode(&decodeWaitedOn) < 0)
return;
pc.elapsedTime = 0;
@@ -408,8 +405,7 @@ static void decodeParent(OutputBuffer * cb)
wakeup_main_task();
while (1) {
- processDecodeInput(cb,
- &do_pause, &bbp, &doCrossFade,
+ processDecodeInput(&do_pause, &bbp, &doCrossFade,
&decodeWaitedOn, &next);
if (pc.stop) {
dropBufferedAudio();
@@ -417,7 +413,7 @@ static void decodeParent(OutputBuffer * cb)
}
if (buffering) {
- if (availableOutputBuffer(cb) < bbp) {
+ if (availableOutputBuffer() < bbp) {
/* not enough decoded buffer space yet */
player_sleep();
continue;
@@ -431,7 +427,7 @@ static void decodeParent(OutputBuffer * cb)
dc.error==DECODE_ERROR_NOERROR) {
/* the decoder is ready and ok */
decodeWaitedOn = 0;
- if(openAudioDevice(&(cb->audioFormat))<0) {
+ if(openAudioDevice(&(cb.audioFormat))<0) {
char tmp[MPD_PATH_MAX];
pc.errored_song = pc.current_song;
pc.error = PLAYER_ERROR_AUDIO;
@@ -450,7 +446,7 @@ static void decodeParent(OutputBuffer * cb)
pc.sampleRate = dc.audioFormat.sampleRate;
pc.bits = dc.audioFormat.bits;
pc.channels = dc.audioFormat.channels;
- sizeToTime = audioFormatSizeToTime(&cb->audioFormat);
+ sizeToTime = audioFormatSizeToTime(&cb.audioFormat);
}
else if(dc.state!=DECODE_STATE_START) {
/* the decoder failed */
@@ -471,7 +467,7 @@ static void decodeParent(OutputBuffer * cb)
pc.queueLockState == PLAYER_QUEUE_UNLOCKED) {
/* the decoder has finished the current song;
make it decode the next song */
- next = cb->end;
+ next = cb.end;
dc.start = 1;
pc.queueState = PLAYER_QUEUE_DECODE;
wakeup_main_task();
@@ -483,7 +479,7 @@ static void decodeParent(OutputBuffer * cb)
calculate how many chunks will be required
for it */
crossFadeChunks =
- calculateCrossFadeChunks(&(cb->audioFormat),
+ calculateCrossFadeChunks(&(cb.audioFormat),
dc.totalTime);
if (crossFadeChunks > 0) {
doCrossFade = 1;
@@ -496,12 +492,12 @@ static void decodeParent(OutputBuffer * cb)
if (do_pause)
player_sleep();
- else if (!outputBufferEmpty(cb) && (int)cb->begin != next) {
+ else if (!outputBufferEmpty() && (int)cb.begin != next) {
OutputBufferChunk *beginChunk =
- outputBufferGetChunk(cb, cb->begin);
+ outputBufferGetChunk(cb.begin);
unsigned int fadePosition;
if (doCrossFade == 1 && next >= 0 &&
- (fadePosition = outputBufferRelative(cb, next))
+ (fadePosition = outputBufferRelative(next))
<= crossFadeChunks) {
/* perform cross fade */
if (nextChunk < 0) {
@@ -512,11 +508,11 @@ static void decodeParent(OutputBuffer * cb)
chunks in the old song */
crossFadeChunks = fadePosition;
}
- nextChunk = outputBufferAbsolute(cb, crossFadeChunks);
+ nextChunk = outputBufferAbsolute(crossFadeChunks);
if (nextChunk >= 0) {
crossFade(beginChunk,
- outputBufferGetChunk(cb, nextChunk),
- &(cb->audioFormat),
+ outputBufferGetChunk(nextChunk),
+ &(cb.audioFormat),
fadePosition,
crossFadeChunks);
} else {
@@ -537,19 +533,19 @@ static void decodeParent(OutputBuffer * cb)
}
/* play the current chunk */
- if (playChunk(beginChunk, &(cb->audioFormat),
+ if (playChunk(beginChunk, &(cb.audioFormat),
sizeToTime) < 0)
break;
- outputBufferShift(cb);
+ outputBufferShift();
player_wakeup_decoder_nb();
- } else if (!outputBufferEmpty(cb) && (int)cb->begin == next) {
+ } else if (!outputBufferEmpty() && (int)cb.begin == next) {
/* at the beginning of a new song */
if (doCrossFade == 1 && nextChunk >= 0) {
/* the cross-fade is finished; skip
the section which was cross-faded
(and thus already played) */
- output_buffer_skip(cb, crossFadeChunks);
+ output_buffer_skip(crossFadeChunks);
}
doCrossFade = 0;
@@ -564,7 +560,7 @@ static void decodeParent(OutputBuffer * cb)
break;
next = -1;
- if (waitOnDecode(cb, &decodeWaitedOn) < 0)
+ if (waitOnDecode(&decodeWaitedOn) < 0)
return;
pc.queueState = PLAYER_QUEUE_EMPTY;
@@ -588,10 +584,7 @@ static void decodeParent(OutputBuffer * cb)
*/
void decode(void)
{
- OutputBuffer *cb;
-
- cb = &(getPlayerData()->buffer);
- clearOutputBuffer(cb);
+ clearOutputBuffer();
dc.error = DECODE_ERROR_NOERROR;
dc.seek = 0;
@@ -599,5 +592,5 @@ void decode(void)
dc.start = 1;
do { player_wakeup_decoder(); } while (dc.start);
- decodeParent(cb);
+ decodeParent();
}