summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/playback.c')
-rw-r--r--apps/playback.c69
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
1392static 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
1404static 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
1411static 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
1391static bool audio_have_tracks(void) 1420static 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
1436static 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 */
1467static void audio_clear_track_entries(void) 1466static 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