forked from len0rd/rockbox
Add logging for all playback queueing, for the simulator at least
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10823 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
3d10a810ed
commit
a3087e4fb0
1 changed files with 164 additions and 59 deletions
219
apps/playback.c
219
apps/playback.c
|
@ -97,6 +97,17 @@ static volatile bool paused;
|
|||
* for their correct seeek target, 32k seems a good size */
|
||||
#define AUDIO_REBUFFER_GUESS_SIZE (1024*32)
|
||||
|
||||
/* macros to enable logf for queues */
|
||||
#ifdef SIMULATOR
|
||||
#define LOGF_QUEUES /* Define this for logf output of all queuing */
|
||||
#endif
|
||||
|
||||
#ifdef LOGF_QUEUES
|
||||
#define LOGFQUEUE(s) logf("%s", s)
|
||||
#else
|
||||
#define LOGFQUEUE(s)
|
||||
#endif
|
||||
|
||||
enum {
|
||||
Q_AUDIO_PLAY = 1,
|
||||
Q_AUDIO_STOP,
|
||||
|
@ -266,7 +277,7 @@ static int mp3_get_file_pos(void);
|
|||
|
||||
static void audio_clear_track_entries(
|
||||
bool clear_buffered, bool clear_unbuffered, bool may_yield);
|
||||
static bool initialize_buffer_fill(bool clear_tracks);
|
||||
static bool audio_initialize_buffer_fill(bool clear_tracks);
|
||||
static void audio_fill_file_buffer(
|
||||
bool start_play, bool rebuffer, size_t offset);
|
||||
|
||||
|
@ -575,7 +586,7 @@ int audio_track_count(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void advance_buffer_counters(size_t amount)
|
||||
static void codec_advance_buffer_counters(size_t amount)
|
||||
{
|
||||
buf_ridx += amount;
|
||||
|
||||
|
@ -590,7 +601,10 @@ static void advance_buffer_counters(size_t amount)
|
|||
if (!pcmbuf_is_lowdata() && !filling)
|
||||
{
|
||||
if (conf_watermark && filebufused <= conf_watermark && playing)
|
||||
{
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER");
|
||||
queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -624,7 +638,10 @@ static size_t codec_filebuf_callback(void *ptr, size_t size)
|
|||
while (copy_n > cur_ti->available)
|
||||
{
|
||||
if (!filling)
|
||||
{
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER");
|
||||
queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
if (ci.stop_codec || ci.new_track)
|
||||
|
@ -640,7 +657,7 @@ static size_t codec_filebuf_callback(void *ptr, size_t size)
|
|||
}
|
||||
|
||||
/* Update read and other position pointers */
|
||||
advance_buffer_counters(copy_n);
|
||||
codec_advance_buffer_counters(copy_n);
|
||||
|
||||
/* Return the actual amount of data copied to the buffer */
|
||||
return copy_n;
|
||||
|
@ -673,15 +690,20 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
|
|||
|
||||
switch (ev.id) {
|
||||
case Q_AUDIO_PLAY:
|
||||
LOGFQUEUE("voice < Q_AUDIO_PLAY");
|
||||
if (playing)
|
||||
swap_codec();
|
||||
break;
|
||||
|
||||
#if defined(HAVE_RECORDING) && !defined(SIMULATOR)
|
||||
case Q_ENCODER_RECORD:
|
||||
LOGFQUEUE("voice < Q_ENCODER_RECORD");
|
||||
swap_codec();
|
||||
break;
|
||||
#endif
|
||||
|
||||
case Q_VOICE_STOP:
|
||||
LOGFQUEUE("voice < Q_VOICE_STOP");
|
||||
if (voice_is_playing)
|
||||
{
|
||||
/* Clear the current buffer */
|
||||
|
@ -699,7 +721,7 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
|
|||
break;
|
||||
|
||||
case SYS_USB_CONNECTED:
|
||||
logf("USB: Voice codec");
|
||||
LOGFQUEUE("voice < SYS_USB_CONNECTED");
|
||||
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
||||
if (audio_codec_loaded)
|
||||
swap_codec();
|
||||
|
@ -707,6 +729,7 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
|
|||
break;
|
||||
|
||||
case Q_VOICE_PLAY:
|
||||
LOGFQUEUE("voice < Q_VOICE_PLAY");
|
||||
{
|
||||
struct voice_info *voice_data;
|
||||
voice_is_playing = true;
|
||||
|
@ -716,8 +739,13 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
|
|||
voicebuf = voice_data->buf;
|
||||
voice_getmore = voice_data->callback;
|
||||
}
|
||||
|
||||
case SYS_TIMEOUT:
|
||||
LOGFQUEUE("voice < SYS_TIMEOUT");
|
||||
goto voice_play_clip;
|
||||
|
||||
default:
|
||||
LOGFQUEUE("voice < default");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -731,6 +759,7 @@ voice_play_clip:
|
|||
/* If this clip is done */
|
||||
if (!voice_remaining)
|
||||
{
|
||||
LOGFQUEUE("voice > voice Q_VOICE_STOP");
|
||||
queue_post(&voice_codec_queue, Q_VOICE_STOP, 0);
|
||||
/* Force pcm playback. */
|
||||
if (!pcm_is_playing())
|
||||
|
@ -766,7 +795,10 @@ static void* codec_request_buffer_callback(size_t *realsize, size_t reqsize)
|
|||
while (copy_n > cur_ti->available)
|
||||
{
|
||||
if (!filling)
|
||||
{
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER");
|
||||
queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
if (ci.stop_codec || ci.new_track)
|
||||
|
@ -990,6 +1022,7 @@ static void audio_check_new_track(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
@ -1003,6 +1036,7 @@ static void audio_check_new_track(void)
|
|||
{
|
||||
if (ci.new_track >= 0)
|
||||
{
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
@ -1010,6 +1044,7 @@ static void audio_check_new_track(void)
|
|||
while (!playlist_check(++ci.new_track))
|
||||
if (ci.new_track >= 0)
|
||||
{
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
@ -1019,6 +1054,7 @@ static void audio_check_new_track(void)
|
|||
|
||||
if (playlist_next(ci.new_track) < 0)
|
||||
{
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
@ -1105,10 +1141,11 @@ static void audio_check_new_track(void)
|
|||
|
||||
skip_done:
|
||||
audio_update_trackinfo();
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_COMPLETE");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
|
||||
}
|
||||
|
||||
static void rebuffer_and_seek(size_t newpos)
|
||||
static void audio_rebuffer_and_seek(size_t newpos)
|
||||
{
|
||||
int fd;
|
||||
char *trackname;
|
||||
|
@ -1119,7 +1156,7 @@ static void rebuffer_and_seek(size_t newpos)
|
|||
fd = open(trackname, O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
logf("Open failed!");
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
@ -1139,7 +1176,7 @@ static void rebuffer_and_seek(size_t newpos)
|
|||
|
||||
last_peek_offset = 0;
|
||||
filling = false;
|
||||
initialize_buffer_fill(true);
|
||||
audio_initialize_buffer_fill(true);
|
||||
filling = true;
|
||||
|
||||
if (newpos > conf_preseek) {
|
||||
|
@ -1157,6 +1194,7 @@ static void rebuffer_and_seek(size_t newpos)
|
|||
|
||||
lseek(current_fd, cur_ti->start_pos, SEEK_SET);
|
||||
|
||||
LOGFQUEUE("audio > codec Q_CODEC_REQUEST_COMPLETE");
|
||||
queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
|
||||
}
|
||||
|
||||
|
@ -1179,6 +1217,7 @@ static void codec_advance_buffer_callback(size_t amount)
|
|||
{
|
||||
struct event ev;
|
||||
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_REBUFFER_SEEK");
|
||||
queue_post(&audio_queue,
|
||||
Q_AUDIO_REBUFFER_SEEK, (void *)(ci.curpos + amount));
|
||||
|
||||
|
@ -1186,18 +1225,22 @@ static void codec_advance_buffer_callback(size_t amount)
|
|||
switch (ev.id)
|
||||
{
|
||||
case Q_CODEC_REQUEST_FAILED:
|
||||
LOGFQUEUE("codec < Q_CODEC_REQUEST_FAILED");
|
||||
ci.stop_codec = true;
|
||||
return;
|
||||
|
||||
case Q_CODEC_REQUEST_COMPLETE:
|
||||
LOGFQUEUE("codec < Q_CODEC_REQUEST_COMPLETE");
|
||||
return;
|
||||
|
||||
default:
|
||||
logf("Bad event on ccq");
|
||||
LOGFQUEUE("codec < default");
|
||||
ci.stop_codec = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
advance_buffer_counters(amount);
|
||||
codec_advance_buffer_counters(amount);
|
||||
|
||||
codec_set_offset_callback(ci.curpos);
|
||||
}
|
||||
|
@ -1264,6 +1307,8 @@ static bool codec_seek_buffer_callback(size_t newpos)
|
|||
{
|
||||
int difference;
|
||||
|
||||
logf("codec_seek_buffer_callback");
|
||||
|
||||
if (newpos >= cur_ti->filesize)
|
||||
newpos = cur_ti->filesize - 1;
|
||||
|
||||
|
@ -1286,20 +1331,23 @@ static bool codec_seek_buffer_callback(size_t newpos)
|
|||
{
|
||||
struct event ev;
|
||||
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_REBUFFER_SEEK");
|
||||
queue_post(&audio_queue, Q_AUDIO_REBUFFER_SEEK, (void *)newpos);
|
||||
|
||||
queue_wait(&codec_callback_queue, &ev);
|
||||
switch (ev.id)
|
||||
{
|
||||
case Q_CODEC_REQUEST_COMPLETE:
|
||||
LOGFQUEUE("codec < Q_CODEC_REQUEST_COMPLETE");
|
||||
return true;
|
||||
|
||||
case Q_CODEC_REQUEST_FAILED:
|
||||
LOGFQUEUE("codec < Q_CODEC_REQUEST_FAILED");
|
||||
ci.stop_codec = true;
|
||||
return false;
|
||||
|
||||
default:
|
||||
logf("Bad event on ccq");
|
||||
LOGFQUEUE("codec < default");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1373,6 +1421,7 @@ static void codec_track_changed(void)
|
|||
{
|
||||
automatic_skip = false;
|
||||
track_changed = true;
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_TRACK_CHANGED");
|
||||
queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0);
|
||||
}
|
||||
|
||||
|
@ -1385,7 +1434,7 @@ static void pcmbuf_track_changed_callback(void)
|
|||
/* Yield to codecs for as long as possible if they are in need of data
|
||||
* return true if the caller should break to let the audio thread process
|
||||
* new events */
|
||||
static bool yield_codecs(void)
|
||||
static bool audio_yield_codecs(void)
|
||||
{
|
||||
yield();
|
||||
|
||||
|
@ -1497,7 +1546,7 @@ static void audio_read_file(bool quick)
|
|||
/* Let the codec process until it is out of the danger zone, or there
|
||||
* is an event to handle. In the latter case, break this fill cycle
|
||||
* immediately */
|
||||
if (quick || yield_codecs())
|
||||
if (quick || audio_yield_codecs())
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1568,7 +1617,7 @@ static const char * get_codec_filename(int enc_spec)
|
|||
return fname;
|
||||
} /* get_codec_filename */
|
||||
|
||||
static bool loadcodec(bool start_play)
|
||||
static bool audio_loadcodec(bool start_play)
|
||||
{
|
||||
size_t size;
|
||||
int fd;
|
||||
|
@ -1594,6 +1643,7 @@ static bool loadcodec(bool start_play)
|
|||
ci.taginfo_ready = &cur_ti->taginfo_ready;
|
||||
ci.curpos = 0;
|
||||
playing = true;
|
||||
LOGFQUEUE("codec > codec Q_CODEC_LOAD_DISK");
|
||||
queue_post(&codec_queue, Q_CODEC_LOAD_DISK, (void *)codec_fn);
|
||||
return true;
|
||||
}
|
||||
|
@ -1655,7 +1705,7 @@ static bool loadcodec(bool start_play)
|
|||
|
||||
tracks[track_widx].codecsize += rc;
|
||||
|
||||
yield_codecs();
|
||||
audio_yield_codecs();
|
||||
}
|
||||
|
||||
tracks[track_widx].has_codec = true;
|
||||
|
@ -1804,7 +1854,7 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer)
|
|||
|
||||
/* Load the codec. */
|
||||
tracks[track_widx].codecbuf = &filebuf[buf_widx];
|
||||
if (!loadcodec(start_play))
|
||||
if (!audio_loadcodec(start_play))
|
||||
{
|
||||
if (tracks[track_widx].codecsize)
|
||||
{
|
||||
|
@ -1919,7 +1969,7 @@ static void audio_clear_track_entries(
|
|||
if (track_unbuffer_callback)
|
||||
{
|
||||
if (may_yield)
|
||||
yield_codecs();
|
||||
audio_yield_codecs();
|
||||
track_unbuffer_callback(&tracks[last_idx].id3, false);
|
||||
}
|
||||
|
||||
|
@ -1943,7 +1993,7 @@ static void audio_clear_track_entries(
|
|||
}
|
||||
}
|
||||
|
||||
static void stop_codec_flush(void)
|
||||
static void audio_stop_codec_flush(void)
|
||||
{
|
||||
ci.stop_codec = true;
|
||||
pcmbuf_pause(true);
|
||||
|
@ -1974,7 +2024,7 @@ static void audio_stop_playback(void)
|
|||
playing = false;
|
||||
filling = false;
|
||||
paused = false;
|
||||
stop_codec_flush();
|
||||
audio_stop_codec_flush();
|
||||
|
||||
if (current_fd >= 0)
|
||||
{
|
||||
|
@ -1995,7 +2045,7 @@ static void audio_play_start(size_t offset)
|
|||
|
||||
/* Wait for any previously playing audio to flush - TODO: Not necessary? */
|
||||
while (audio_codec_loaded)
|
||||
stop_codec_flush();
|
||||
audio_stop_codec_flush();
|
||||
|
||||
track_changed = true;
|
||||
playlist_end = false;
|
||||
|
@ -2024,7 +2074,7 @@ static void audio_play_start(size_t offset)
|
|||
}
|
||||
|
||||
/* Send callback events to notify about new tracks. */
|
||||
static void generate_postbuffer_events(void)
|
||||
static void audio_generate_postbuffer_events(void)
|
||||
{
|
||||
int cur_idx;
|
||||
int last_idx = -1;
|
||||
|
@ -2065,7 +2115,7 @@ static void generate_postbuffer_events(void)
|
|||
}
|
||||
}
|
||||
|
||||
static bool initialize_buffer_fill(bool clear_tracks)
|
||||
static bool audio_initialize_buffer_fill(bool clear_tracks)
|
||||
{
|
||||
/* Don't initialize if we're already initialized */
|
||||
if (filling)
|
||||
|
@ -2105,7 +2155,7 @@ static void audio_fill_file_buffer(
|
|||
{
|
||||
bool had_next_track = audio_next_track() != NULL;
|
||||
|
||||
if (!initialize_buffer_fill(!start_play))
|
||||
if (!audio_initialize_buffer_fill(!start_play))
|
||||
return ;
|
||||
|
||||
/* If we have a partially buffered track, continue loading,
|
||||
|
@ -2123,7 +2173,7 @@ static void audio_fill_file_buffer(
|
|||
{
|
||||
read_next_metadata();
|
||||
|
||||
generate_postbuffer_events();
|
||||
audio_generate_postbuffer_events();
|
||||
filling = false;
|
||||
|
||||
#ifndef SIMULATOR
|
||||
|
@ -2133,12 +2183,13 @@ static void audio_fill_file_buffer(
|
|||
}
|
||||
}
|
||||
|
||||
static void track_skip_done(bool was_manual)
|
||||
static void codec_track_skip_done(bool was_manual)
|
||||
{
|
||||
/* Manual track change (always crossfade or flush audio). */
|
||||
if (was_manual)
|
||||
{
|
||||
pcmbuf_crossfade_init(true);
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_TRACK_CHANGED");
|
||||
queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0);
|
||||
}
|
||||
/* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */
|
||||
|
@ -2156,7 +2207,7 @@ static void track_skip_done(bool was_manual)
|
|||
}
|
||||
}
|
||||
|
||||
static bool load_next_track(void)
|
||||
static bool codec_load_next_track(void)
|
||||
{
|
||||
struct event ev;
|
||||
|
||||
|
@ -2176,6 +2227,7 @@ static bool load_next_track(void)
|
|||
}
|
||||
|
||||
cpu_boost(true);
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_CHECK_NEW_TRACK");
|
||||
queue_post(&audio_queue, Q_AUDIO_CHECK_NEW_TRACK, 0);
|
||||
while (1)
|
||||
{
|
||||
|
@ -2192,14 +2244,18 @@ static bool load_next_track(void)
|
|||
switch (ev.id)
|
||||
{
|
||||
case Q_CODEC_REQUEST_COMPLETE:
|
||||
track_skip_done(!automatic_skip);
|
||||
LOGFQUEUE("codec < Q_CODEC_REQUEST_COMPLETE");
|
||||
codec_track_skip_done(!automatic_skip);
|
||||
return true;
|
||||
|
||||
case Q_CODEC_REQUEST_FAILED:
|
||||
LOGFQUEUE("codec < Q_CODEC_REQUEST_FAILED");
|
||||
ci.new_track = 0;
|
||||
ci.stop_codec = true;
|
||||
return false;
|
||||
|
||||
default:
|
||||
logf("Bad event on ccq");
|
||||
LOGFQUEUE("codec < default");
|
||||
ci.stop_codec = true;
|
||||
return false;
|
||||
}
|
||||
|
@ -2220,7 +2276,7 @@ static bool codec_request_next_track_callback(void)
|
|||
|
||||
prev_codectype = get_codec_base_type(cur_ti->id3.codectype);
|
||||
|
||||
if (!load_next_track())
|
||||
if (!codec_load_next_track())
|
||||
return false;
|
||||
|
||||
/* Check if the next codec is the same file. */
|
||||
|
@ -2294,7 +2350,7 @@ static void audio_new_playlist(void)
|
|||
audio_fill_file_buffer(false, true, 0);
|
||||
}
|
||||
|
||||
static void initiate_track_change(long direction)
|
||||
static void audio_initiate_track_change(long direction)
|
||||
{
|
||||
if (playlist_check(direction))
|
||||
{
|
||||
|
@ -2307,7 +2363,7 @@ static void initiate_track_change(long direction)
|
|||
}
|
||||
}
|
||||
|
||||
static void initiate_dir_change(long direction)
|
||||
static void audio_initiate_dir_change(long direction)
|
||||
{
|
||||
playlist_end = false;
|
||||
dir_skip = true;
|
||||
|
@ -2333,6 +2389,7 @@ void audio_thread(void)
|
|||
|
||||
switch (ev.id) {
|
||||
case Q_AUDIO_FILL_BUFFER:
|
||||
LOGFQUEUE("audio < Q_AUDIO_FILL_BUFFER");
|
||||
if (!filling)
|
||||
if (!playing || playlist_end || ci.stop_codec)
|
||||
break;
|
||||
|
@ -2340,70 +2397,71 @@ void audio_thread(void)
|
|||
break;
|
||||
|
||||
case Q_AUDIO_PLAY:
|
||||
logf("starting...");
|
||||
LOGFQUEUE("audio < Q_AUDIO_PLAY");
|
||||
audio_clear_track_entries(true, false, true);
|
||||
audio_play_start((size_t)ev.data);
|
||||
break ;
|
||||
|
||||
case Q_AUDIO_STOP:
|
||||
logf("audio_stop");
|
||||
LOGFQUEUE("audio < Q_AUDIO_STOP");
|
||||
audio_stop_playback();
|
||||
break ;
|
||||
|
||||
case Q_AUDIO_PAUSE:
|
||||
logf("audio_%s",ev.data?"pause":"resume");
|
||||
LOGFQUEUE("audio < Q_AUDIO_PAUSE");
|
||||
pcmbuf_pause((bool)ev.data);
|
||||
paused = (bool)ev.data;
|
||||
break ;
|
||||
|
||||
case Q_AUDIO_SKIP:
|
||||
logf("audio_skip");
|
||||
initiate_track_change((long)ev.data);
|
||||
LOGFQUEUE("audio < Q_AUDIO_SKIP");
|
||||
audio_initiate_track_change((long)ev.data);
|
||||
break;
|
||||
|
||||
case Q_AUDIO_PRE_FF_REWIND:
|
||||
LOGFQUEUE("audio < Q_AUDIO_PRE_FF_REWIND");
|
||||
if (!playing)
|
||||
break;
|
||||
logf("pre_ff_rewind");
|
||||
pcmbuf_pause(true);
|
||||
break;
|
||||
|
||||
case Q_AUDIO_FF_REWIND:
|
||||
LOGFQUEUE("audio < Q_AUDIO_FF_REWIND");
|
||||
if (!playing)
|
||||
break ;
|
||||
logf("ff_rewind");
|
||||
ci.seek_time = (long)ev.data+1;
|
||||
break ;
|
||||
|
||||
case Q_AUDIO_REBUFFER_SEEK:
|
||||
logf("Re-buffering song w/seek");
|
||||
rebuffer_and_seek((size_t)ev.data);
|
||||
LOGFQUEUE("audio < Q_AUDIO_REBUFFER_SEEK");
|
||||
audio_rebuffer_and_seek((size_t)ev.data);
|
||||
break;
|
||||
|
||||
case Q_AUDIO_CHECK_NEW_TRACK:
|
||||
logf("Check new track buffer");
|
||||
LOGFQUEUE("audio < Q_AUDIO_CHECK_NEW_TRACK");
|
||||
audio_check_new_track();
|
||||
break;
|
||||
|
||||
case Q_AUDIO_DIR_SKIP:
|
||||
logf("audio_dir_skip");
|
||||
LOGFQUEUE("audio < Q_AUDIO_DIR_SKIP");
|
||||
playlist_end = false;
|
||||
if (global_settings.beep)
|
||||
pcmbuf_beep(5000, 100, 2500*global_settings.beep);
|
||||
initiate_dir_change((long)ev.data);
|
||||
audio_initiate_dir_change((long)ev.data);
|
||||
break;
|
||||
|
||||
case Q_AUDIO_NEW_PLAYLIST:
|
||||
logf("new_playlist");
|
||||
LOGFQUEUE("audio < Q_AUDIO_NEW_PLAYLIST");
|
||||
audio_new_playlist();
|
||||
break;
|
||||
|
||||
case Q_AUDIO_FLUSH:
|
||||
logf("flush & reload");
|
||||
LOGFQUEUE("audio < Q_AUDIO_FLUSH");
|
||||
audio_invalidate_tracks();
|
||||
break ;
|
||||
|
||||
case Q_AUDIO_TRACK_CHANGED:
|
||||
LOGFQUEUE("audio < Q_AUDIO_TRACK_CHANGED");
|
||||
if (track_changed_callback)
|
||||
track_changed_callback(&cur_ti->id3);
|
||||
track_changed = true;
|
||||
|
@ -2412,14 +2470,19 @@ void audio_thread(void)
|
|||
|
||||
#ifndef SIMULATOR
|
||||
case SYS_USB_CONNECTED:
|
||||
logf("USB: Audio core");
|
||||
LOGFQUEUE("audio < SYS_USB_CONNECTED");
|
||||
audio_stop_playback();
|
||||
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
||||
usb_wait_for_disconnect(&audio_queue);
|
||||
break ;
|
||||
#endif
|
||||
|
||||
case SYS_TIMEOUT:
|
||||
LOGFQUEUE("audio < SYS_TIMEOUT");
|
||||
break;
|
||||
|
||||
default:
|
||||
LOGFQUEUE("audio < default");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2436,10 +2499,13 @@ static void codec_thread(void)
|
|||
|
||||
switch (ev.id) {
|
||||
case Q_CODEC_LOAD_DISK:
|
||||
logf("Codec load disk");
|
||||
LOGFQUEUE("codec < Q_CODEC_LOAD_DISK");
|
||||
audio_codec_loaded = true;
|
||||
if (voice_codec_loaded)
|
||||
{
|
||||
LOGFQUEUE("codec > voice Q_AUDIO_PLAY");
|
||||
queue_post(&voice_codec_queue, Q_AUDIO_PLAY, 0);
|
||||
}
|
||||
mutex_lock(&mutex_codecthread);
|
||||
current_codec = CODEC_IDX_AUDIO;
|
||||
ci.stop_codec = false;
|
||||
|
@ -2448,7 +2514,7 @@ static void codec_thread(void)
|
|||
break ;
|
||||
|
||||
case Q_CODEC_LOAD:
|
||||
logf("Codec load ram");
|
||||
LOGFQUEUE("codec < Q_CODEC_LOAD");
|
||||
if (!cur_ti->has_codec) {
|
||||
logf("Codec slot is empty!");
|
||||
/* Wait for the pcm buffer to go empty */
|
||||
|
@ -2456,13 +2522,17 @@ static void codec_thread(void)
|
|||
yield();
|
||||
/* This must be set to prevent an infinite loop */
|
||||
ci.stop_codec = true;
|
||||
LOGFQUEUE("codec > codec Q_AUDIO_PLAY");
|
||||
queue_post(&codec_queue, Q_AUDIO_PLAY, 0);
|
||||
break ;
|
||||
}
|
||||
|
||||
audio_codec_loaded = true;
|
||||
if (voice_codec_loaded)
|
||||
{
|
||||
LOGFQUEUE("codec > voice Q_AUDIO_PLAY");
|
||||
queue_post(&voice_codec_queue, Q_AUDIO_PLAY, 0);
|
||||
}
|
||||
mutex_lock(&mutex_codecthread);
|
||||
current_codec = CODEC_IDX_AUDIO;
|
||||
ci.stop_codec = false;
|
||||
|
@ -2474,10 +2544,13 @@ static void codec_thread(void)
|
|||
|
||||
#if defined(HAVE_RECORDING) && !defined(SIMULATOR)
|
||||
case Q_ENCODER_LOAD_DISK:
|
||||
logf("Encoder load disk");
|
||||
LOGFQUEUE("codec < Q_ENCODER_LOAD_DISK");
|
||||
audio_codec_loaded = false;
|
||||
if (voice_codec_loaded && current_codec == CODEC_IDX_VOICE)
|
||||
{
|
||||
LOGFQUEUE("codec > voice Q_ENCODER_RECORD");
|
||||
queue_post(&voice_codec_queue, Q_ENCODER_RECORD, NULL);
|
||||
}
|
||||
mutex_lock(&mutex_codecthread);
|
||||
current_codec = CODEC_IDX_AUDIO;
|
||||
ci.stop_codec = false;
|
||||
|
@ -2488,14 +2561,17 @@ static void codec_thread(void)
|
|||
|
||||
#ifndef SIMULATOR
|
||||
case SYS_USB_CONNECTED:
|
||||
LOGFQUEUE("codec < SYS_USB_CONNECTED");
|
||||
queue_clear(&codec_queue);
|
||||
logf("USB: Audio codec");
|
||||
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
||||
if (voice_codec_loaded)
|
||||
swap_codec();
|
||||
usb_wait_for_disconnect(&codec_queue);
|
||||
break ;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
LOGFQUEUE("codec < default");
|
||||
}
|
||||
|
||||
if (audio_codec_loaded)
|
||||
|
@ -2512,6 +2588,7 @@ static void codec_thread(void)
|
|||
switch (ev.id) {
|
||||
case Q_CODEC_LOAD_DISK:
|
||||
case Q_CODEC_LOAD:
|
||||
LOGFQUEUE("codec < Q_CODEC_LOAD");
|
||||
if (playing)
|
||||
{
|
||||
if (ci.new_track || status != CODEC_OK)
|
||||
|
@ -2522,9 +2599,10 @@ static void codec_thread(void)
|
|||
gui_syncsplash(HZ*2, true, "Codec failure");
|
||||
}
|
||||
|
||||
if (!load_next_track())
|
||||
if (!codec_load_next_track())
|
||||
{
|
||||
// queue_post(&codec_queue, Q_AUDIO_STOP, 0);
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_STOP");
|
||||
queue_post(&audio_queue, Q_AUDIO_STOP, 0);
|
||||
break;
|
||||
}
|
||||
|
@ -2538,25 +2616,35 @@ static void codec_thread(void)
|
|||
* triggering the WPS exit */
|
||||
while(pcm_is_playing())
|
||||
sleep(1);
|
||||
LOGFQUEUE("codec > audio Q_AUDIO_STOP");
|
||||
queue_post(&audio_queue, Q_AUDIO_STOP, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cur_ti->has_codec)
|
||||
{
|
||||
LOGFQUEUE("codec > codec Q_CODEC_LOAD");
|
||||
queue_post(&codec_queue, Q_CODEC_LOAD, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *codec_fn = get_codec_filename(cur_ti->id3.codectype);
|
||||
LOGFQUEUE("codec > codec Q_CODEC_LOAD_DISK");
|
||||
queue_post(&codec_queue, Q_CODEC_LOAD_DISK,
|
||||
(void *)codec_fn);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LOGFQUEUE("codec < default");
|
||||
|
||||
} /* end switch */
|
||||
}
|
||||
}
|
||||
|
||||
static void reset_buffer(void)
|
||||
static void audio_reset_buffer(void)
|
||||
{
|
||||
size_t offset;
|
||||
|
||||
|
@ -2607,6 +2695,7 @@ void audio_load_encoder(int enc_id)
|
|||
|
||||
audio_remove_encoder();
|
||||
|
||||
LOGFQUEUE("audio > codec Q_ENCODER_LOAD_DISK");
|
||||
queue_post(&codec_queue, Q_ENCODER_LOAD_DISK, (void *)enc_fn);
|
||||
|
||||
while (!ci.enc_codec_loaded)
|
||||
|
@ -2757,19 +2846,24 @@ void audio_play(long offset)
|
|||
{
|
||||
logf("audio_play");
|
||||
if (playing && offset <= 0)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_NEW_PLAYLIST");
|
||||
queue_post(&audio_queue, Q_AUDIO_NEW_PLAYLIST, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (playing)
|
||||
audio_stop();
|
||||
|
||||
playing = true;
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_PLAY");
|
||||
queue_post(&audio_queue, Q_AUDIO_PLAY, (void *)offset);
|
||||
}
|
||||
}
|
||||
|
||||
void audio_stop(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_STOP");
|
||||
queue_post(&audio_queue, Q_AUDIO_STOP, 0);
|
||||
while (playing || audio_codec_loaded)
|
||||
yield();
|
||||
|
@ -2782,11 +2876,13 @@ bool mp3_pause_done(void)
|
|||
|
||||
void audio_pause(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_PAUSE");
|
||||
queue_post(&audio_queue, Q_AUDIO_PAUSE, (void *)true);
|
||||
}
|
||||
|
||||
void audio_resume(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_PAUSE resume");
|
||||
queue_post(&audio_queue, Q_AUDIO_PAUSE, (void *)false);
|
||||
}
|
||||
|
||||
|
@ -2797,7 +2893,7 @@ void audio_next(void)
|
|||
|
||||
/* Should be safe to do outside of thread, that way we get
|
||||
* the instant wps response at least. */
|
||||
initiate_track_change(1);
|
||||
audio_initiate_track_change(1);
|
||||
// queue_post(&audio_queue, Q_AUDIO_SKIP, (void *)1);
|
||||
}
|
||||
|
||||
|
@ -2806,32 +2902,37 @@ void audio_prev(void)
|
|||
if (global_settings.beep)
|
||||
pcmbuf_beep(5000, 100, 2500*global_settings.beep);
|
||||
|
||||
initiate_track_change(-1);
|
||||
audio_initiate_track_change(-1);
|
||||
// queue_post(&audio_queue, Q_AUDIO_SKIP, (void *)-1);
|
||||
}
|
||||
|
||||
void audio_next_dir(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_DIR_SKIP 1");
|
||||
queue_post(&audio_queue, Q_AUDIO_DIR_SKIP, (void *)1);
|
||||
}
|
||||
|
||||
void audio_prev_dir(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_DIR_SKIP -1");
|
||||
queue_post(&audio_queue, Q_AUDIO_DIR_SKIP, (void *)-1);
|
||||
}
|
||||
|
||||
void audio_pre_ff_rewind(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_PRE_FF_REWIND");
|
||||
queue_post(&audio_queue, Q_AUDIO_PRE_FF_REWIND, 0);
|
||||
}
|
||||
|
||||
void audio_ff_rewind(long newpos)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_FF_REWIND");
|
||||
queue_post(&audio_queue, Q_AUDIO_FF_REWIND, (int *)newpos);
|
||||
}
|
||||
|
||||
void audio_flush_and_reload_tracks(void)
|
||||
{
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_FLUSH");
|
||||
queue_post(&audio_queue, Q_AUDIO_FLUSH, 0);
|
||||
}
|
||||
|
||||
|
@ -2982,7 +3083,9 @@ void mp3_play_data(const unsigned char* start, int size,
|
|||
voice_clip.callback = get_more;
|
||||
voice_clip.buf = (char *)start;
|
||||
voice_clip.size = size;
|
||||
logf("mp3 > voice Q_VOICE_STOP");
|
||||
queue_post(&voice_codec_queue, Q_VOICE_STOP, 0);
|
||||
logf("mp3 > voice Q_VOICE_PLAY");
|
||||
queue_post(&voice_codec_queue, Q_VOICE_PLAY, &voice_clip);
|
||||
voice_is_playing = true;
|
||||
voice_boost_cpu(true);
|
||||
|
@ -2990,6 +3093,7 @@ void mp3_play_data(const unsigned char* start, int size,
|
|||
|
||||
void mp3_play_stop(void)
|
||||
{
|
||||
logf("mp3 > voice Q_VOICE_STOP");
|
||||
queue_post(&voice_codec_queue, Q_VOICE_STOP, 0);
|
||||
}
|
||||
|
||||
|
@ -3035,6 +3139,7 @@ void audio_set_crossfade(int enable)
|
|||
/* Store the track resume position */
|
||||
offset = cur_ti->id3.offset;
|
||||
/* Playback has to be stopped before changing the buffer size. */
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_STOP");
|
||||
queue_post(&audio_queue, Q_AUDIO_STOP, 0);
|
||||
while (audio_codec_loaded)
|
||||
yield();
|
||||
|
@ -3044,7 +3149,7 @@ void audio_set_crossfade(int enable)
|
|||
/* Re-initialize audio system. */
|
||||
pcmbuf_init(size);
|
||||
pcmbuf_crossfade_enable(enable);
|
||||
reset_buffer();
|
||||
audio_reset_buffer();
|
||||
logf("abuf:%dB", pcmbuf_get_bufsize());
|
||||
logf("fbuf:%dB", filebuflen);
|
||||
|
||||
|
@ -3053,6 +3158,7 @@ void audio_set_crossfade(int enable)
|
|||
/* Restart playback. */
|
||||
if (was_playing) {
|
||||
playing = true;
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_PLAY");
|
||||
queue_post(&audio_queue, Q_AUDIO_PLAY, (void *)offset);
|
||||
|
||||
/* Wait for the playback to start again (and display the splash
|
||||
|
@ -3192,8 +3298,7 @@ void audio_preinit(void)
|
|||
|
||||
void audio_init(void)
|
||||
{
|
||||
logf("playback system post-init");
|
||||
|
||||
LOGFQUEUE("audio > audio Q_AUDIO_POSTINIT");
|
||||
queue_post(&audio_queue, Q_AUDIO_POSTINIT, 0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue