diff options
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 69 |
1 files changed, 36 insertions, 33 deletions
diff --git a/apps/playback.c b/apps/playback.c index 119e37a073..1101517aef 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include "codecs.h" | 41 | #include "codecs.h" |
42 | #include "audio.h" | 42 | #include "audio.h" |
43 | #include "buffering.h" | 43 | #include "buffering.h" |
44 | #include "events.h" | ||
44 | #include "voice_thread.h" | 45 | #include "voice_thread.h" |
45 | #include "mp3_playback.h" | 46 | #include "mp3_playback.h" |
46 | #include "usb.h" | 47 | #include "usb.h" |
@@ -1386,6 +1387,34 @@ static void codec_thread(void) | |||
1386 | } | 1387 | } |
1387 | 1388 | ||
1388 | 1389 | ||
1390 | /* --- Buffering callbacks --- */ | ||
1391 | |||
1392 | static void buffering_low_buffer_callback(void *data) | ||
1393 | { | ||
1394 | (void)data; | ||
1395 | logf("low buffer callback"); | ||
1396 | |||
1397 | if (filling == STATE_FULL) { | ||
1398 | /* force a refill */ | ||
1399 | LOGFQUEUE("buffering > audio Q_AUDIO_FILL_BUFFER"); | ||
1400 | queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0); | ||
1401 | } | ||
1402 | } | ||
1403 | |||
1404 | static void buffering_handle_rebuffer_callback(void *data) | ||
1405 | { | ||
1406 | (void)data; | ||
1407 | LOGFQUEUE("audio >| audio Q_AUDIO_FLUSH"); | ||
1408 | queue_post(&audio_queue, Q_AUDIO_FLUSH, 0); | ||
1409 | } | ||
1410 | |||
1411 | static void buffering_handle_finished_callback(int *data) | ||
1412 | { | ||
1413 | logf("handle %d finished buffering", *data); | ||
1414 | strip_tags(*data); | ||
1415 | } | ||
1416 | |||
1417 | |||
1389 | /* --- Audio thread --- */ | 1418 | /* --- Audio thread --- */ |
1390 | 1419 | ||
1391 | static bool audio_have_tracks(void) | 1420 | static bool audio_have_tracks(void) |
@@ -1433,36 +1462,6 @@ static void audio_update_trackinfo(void) | |||
1433 | ci.taginfo_ready = &CUR_TI->taginfo_ready; | 1462 | ci.taginfo_ready = &CUR_TI->taginfo_ready; |
1434 | } | 1463 | } |
1435 | 1464 | ||
1436 | static void buffering_audio_callback(enum callback_event ev, int value) | ||
1437 | { | ||
1438 | (void)value; | ||
1439 | logf("buffering_audio_callback"); | ||
1440 | |||
1441 | switch (ev) | ||
1442 | { | ||
1443 | case EVENT_BUFFER_LOW: | ||
1444 | if (filling == STATE_FULL) { | ||
1445 | /* force a refill */ | ||
1446 | LOGFQUEUE("buffering > audio Q_AUDIO_FILL_BUFFER"); | ||
1447 | queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0); | ||
1448 | } | ||
1449 | break; | ||
1450 | |||
1451 | case EVENT_HANDLE_REBUFFER: | ||
1452 | LOGFQUEUE("audio >| audio Q_AUDIO_FLUSH"); | ||
1453 | queue_post(&audio_queue, Q_AUDIO_FLUSH, 0); | ||
1454 | break; | ||
1455 | |||
1456 | case EVENT_HANDLE_FINISHED: | ||
1457 | logf("handle %d finished buffering", value); | ||
1458 | strip_tags(value); | ||
1459 | break; | ||
1460 | |||
1461 | default: | ||
1462 | break; | ||
1463 | } | ||
1464 | } | ||
1465 | |||
1466 | /* Clear tracks between write and read, non inclusive */ | 1465 | /* Clear tracks between write and read, non inclusive */ |
1467 | static void audio_clear_track_entries(void) | 1466 | static void audio_clear_track_entries(void) |
1468 | { | 1467 | { |
@@ -2062,6 +2061,8 @@ static void audio_stop_playback(void) | |||
2062 | /* TODO: Create auto bookmark too? */ | 2061 | /* TODO: Create auto bookmark too? */ |
2063 | 2062 | ||
2064 | prev_track_elapsed = curtrack_id3.elapsed; | 2063 | prev_track_elapsed = curtrack_id3.elapsed; |
2064 | |||
2065 | remove_event(EVENT_BUFFER_LOW, buffering_low_buffer_callback); | ||
2065 | } | 2066 | } |
2066 | 2067 | ||
2067 | paused = false; | 2068 | paused = false; |
@@ -2076,8 +2077,6 @@ static void audio_stop_playback(void) | |||
2076 | /* Close all tracks */ | 2077 | /* Close all tracks */ |
2077 | audio_release_tracks(); | 2078 | audio_release_tracks(); |
2078 | 2079 | ||
2079 | unregister_buffering_callback(buffering_audio_callback); | ||
2080 | |||
2081 | memset(&curtrack_id3, 0, sizeof(struct mp3entry)); | 2080 | memset(&curtrack_id3, 0, sizeof(struct mp3entry)); |
2082 | } | 2081 | } |
2083 | 2082 | ||
@@ -2121,7 +2120,8 @@ static void audio_play_start(size_t offset) | |||
2121 | #endif | 2120 | #endif |
2122 | 2121 | ||
2123 | audio_fill_file_buffer(true, offset); | 2122 | audio_fill_file_buffer(true, offset); |
2124 | register_buffering_callback(buffering_audio_callback); | 2123 | |
2124 | add_event(EVENT_BUFFER_LOW, false, buffering_low_buffer_callback); | ||
2125 | 2125 | ||
2126 | LOGFQUEUE("audio > audio Q_AUDIO_TRACK_CHANGED"); | 2126 | LOGFQUEUE("audio > audio Q_AUDIO_TRACK_CHANGED"); |
2127 | queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0); | 2127 | queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0); |
@@ -2512,6 +2512,9 @@ void audio_init(void) | |||
2512 | #endif | 2512 | #endif |
2513 | } | 2513 | } |
2514 | 2514 | ||
2515 | add_event(EVENT_HANDLE_REBUFFER, false, buffering_handle_rebuffer_callback); | ||
2516 | add_event(EVENT_HANDLE_FINISHED, false, buffering_handle_finished_callback); | ||
2517 | |||
2515 | /* Probably safe to say */ | 2518 | /* Probably safe to say */ |
2516 | audio_is_initialized = true; | 2519 | audio_is_initialized = true; |
2517 | 2520 | ||