summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c19
-rw-r--r--firmware/export/pcm_playback.h1
-rw-r--r--firmware/pcm_playback.c28
3 files changed, 28 insertions, 20 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 9abc3e38a9..2f67b6c3ba 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -438,8 +438,8 @@ void audio_fill_file_buffer(void)
438 } 438 }
439 439
440 buf_widx += rc; 440 buf_widx += rc;
441 if (buf_widx == codecbuflen) 441 if (buf_widx >= codecbuflen)
442 buf_widx = 0; 442 buf_widx -= codecbuflen;
443 i += rc; 443 i += rc;
444 tracks[track_widx].available += rc; 444 tracks[track_widx].available += rc;
445 fill_bytesleft -= rc; 445 fill_bytesleft -= rc;
@@ -552,7 +552,7 @@ bool loadcodec(const char *trackname, bool start_play)
552 return false; 552 return false;
553 buf_widx += rc; 553 buf_widx += rc;
554 if (buf_widx >= codecbuflen) 554 if (buf_widx >= codecbuflen)
555 buf_widx = 0; 555 buf_widx -= codecbuflen;
556 i += rc; 556 i += rc;
557 } 557 }
558 close(fd); 558 close(fd);
@@ -598,7 +598,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
598 598
599 /* Load the codec */ 599 /* Load the codec */
600 if (buf_widx >= codecbuflen) 600 if (buf_widx >= codecbuflen)
601 buf_widx = 0; 601 buf_widx -= codecbuflen;
602 602
603 tracks[track_widx].codecbuf = &codecbuf[buf_widx]; 603 tracks[track_widx].codecbuf = &codecbuf[buf_widx];
604 if (!loadcodec(trackname, start_play)) { 604 if (!loadcodec(trackname, start_play)) {
@@ -742,15 +742,15 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
742 } 742 }
743 buf_widx += rc; 743 buf_widx += rc;
744 if (buf_widx >= codecbuflen) 744 if (buf_widx >= codecbuflen)
745 buf_widx = 0; 745 buf_widx -= codecbuflen;
746 i += rc; 746 i += rc;
747 tracks[track_widx].available += rc; 747 tracks[track_widx].available += rc;
748 tracks[track_widx].filerem -= rc; 748 tracks[track_widx].filerem -= rc;
749 codecbufused += rc;
749 fill_bytesleft -= rc; 750 fill_bytesleft -= rc;
750 } 751 }
751 752
752 tracks[track_widx].filepos = i; 753 tracks[track_widx].filepos = i;
753 codecbufused += i;
754 754
755 /* Leave the file handle open for faster buffer refill. */ 755 /* Leave the file handle open for faster buffer refill. */
756 if (tracks[track_widx].filerem != 0) { 756 if (tracks[track_widx].filerem != 0) {
@@ -809,8 +809,8 @@ void audio_check_buffer(void)
809 809
810 /* Fill buffer as full as possible for cross-fader. */ 810 /* Fill buffer as full as possible for cross-fader. */
811#ifndef SIMULATOR 811#ifndef SIMULATOR
812 if (cur_ti->id3.length > 0 && 812 if (pcm_is_crossfade_enabled() && cur_ti->id3.length > 0
813 cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing) 813 && cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing)
814 pcm_set_boost_mode(true); 814 pcm_set_boost_mode(true);
815#endif 815#endif
816 816
@@ -873,6 +873,7 @@ void audio_update_trackinfo(void)
873 873
874 cur_ti = &tracks[track_ridx]; 874 cur_ti = &tracks[track_ridx];
875 buf_ridx += cur_ti->codecsize; 875 buf_ridx += cur_ti->codecsize;
876 codecbufused -= cur_ti->codecsize;
876 if (buf_ridx >= codecbuflen) 877 if (buf_ridx >= codecbuflen)
877 buf_ridx -= codecbuflen; 878 buf_ridx -= codecbuflen;
878#ifndef SIMULATOR 879#ifndef SIMULATOR
@@ -989,7 +990,7 @@ void audio_thread(void)
989 struct event ev; 990 struct event ev;
990 991
991 while (1) { 992 while (1) {
992 yield(); 993 sleep(50);
993 audio_check_buffer(); 994 audio_check_buffer();
994 995
995 queue_wait_w_tmo(&audio_queue, &ev, 10); 996 queue_wait_w_tmo(&audio_queue, &ev, 10);
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h
index 0f2de83224..32288d7d91 100644
--- a/firmware/export/pcm_playback.h
+++ b/firmware/export/pcm_playback.h
@@ -45,6 +45,7 @@ bool pcm_is_lowdata(void);
45void pcm_crossfade_start(void); 45void pcm_crossfade_start(void);
46unsigned int audiobuffer_get_latency(void); 46unsigned int audiobuffer_get_latency(void);
47bool audiobuffer_insert(char *buf, size_t length); 47bool audiobuffer_insert(char *buf, size_t length);
48bool pcm_is_crossfade_enabled(void);
48void pcm_crossfade_enable(bool on_off); 49void pcm_crossfade_enable(bool on_off);
49 50
50#endif 51#endif
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 34310cf916..049978e381 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -99,15 +99,6 @@ static void dma_start(const void *addr, long size)
99 DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START; 99 DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START;
100} 100}
101 101
102/* Stops the DMA transfer and interrupt */
103static void dma_stop(void)
104{
105 pcm_playing = false;
106
107 /* Reset the FIFO */
108 IIS2CONFIG = 0x800;
109}
110
111void pcm_boost(bool state) 102void pcm_boost(bool state)
112{ 103{
113 static bool boost_state = false; 104 static bool boost_state = false;
@@ -121,6 +112,16 @@ void pcm_boost(bool state)
121 } 112 }
122} 113}
123 114
115/* Stops the DMA transfer and interrupt */
116static void dma_stop(void)
117{
118 pcm_playing = false;
119
120 /* Reset the FIFO */
121 IIS2CONFIG = 0x800;
122 pcm_boost(false);
123}
124
124/* set volume of the main channel */ 125/* set volume of the main channel */
125void pcm_set_volume(int volume) 126void pcm_set_volume(int volume)
126{ 127{
@@ -385,6 +386,7 @@ bool pcm_is_lowdata(void)
385 386
386void pcm_crossfade_start(void) 387void pcm_crossfade_start(void)
387{ 388{
389 //logf("cf:%d", audiobuffer_free / CHUNK_SIZE);
388 if (audiobuffer_free > CHUNK_SIZE * 4 || !crossfade_enabled) { 390 if (audiobuffer_free > CHUNK_SIZE * 4 || !crossfade_enabled) {
389 return ; 391 return ;
390 } 392 }
@@ -493,6 +495,7 @@ void pcm_play_init(void)
493 pcmbuf_read_index = 0; 495 pcmbuf_read_index = 0;
494 pcmbuf_write_index = 0; 496 pcmbuf_write_index = 0;
495 pcmbuf_unplayed_bytes = 0; 497 pcmbuf_unplayed_bytes = 0;
498 crossfade_enabled = false;
496 pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); 499 pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback);
497 500
498 /* Play a small chunk of zeroes to initialize the playback system. */ 501 /* Play a small chunk of zeroes to initialize the playback system. */
@@ -501,9 +504,7 @@ void pcm_play_init(void)
501 memset(&audiobuffer[0], 0, audiobuffer_pos); 504 memset(&audiobuffer[0], 0, audiobuffer_pos);
502 pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL); 505 pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL);
503 pcm_play_start(); 506 pcm_play_start();
504 cpu_boost(false);
505 507
506 crossfade_enabled = false;
507} 508}
508 509
509void pcm_crossfade_enable(bool on_off) 510void pcm_crossfade_enable(bool on_off)
@@ -511,6 +512,11 @@ void pcm_crossfade_enable(bool on_off)
511 crossfade_enabled = on_off; 512 crossfade_enabled = on_off;
512} 513}
513 514
515bool pcm_is_crossfade_enabled(void)
516{
517 return crossfade_enabled;
518}
519
514void pcm_play_start(void) 520void pcm_play_start(void)
515{ 521{
516 struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; 522 struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index];