diff options
author | Brandon Low <lostlogic@rockbox.org> | 2006-01-21 22:42:44 +0000 |
---|---|---|
committer | Brandon Low <lostlogic@rockbox.org> | 2006-01-21 22:42:44 +0000 |
commit | a3868d35d3621e700abfd51de61ac6f83908a472 (patch) | |
tree | a90cc5fb4c285864a182cdb7b1f328ce7324a0a7 /apps/pcmbuf.c | |
parent | 3458be2d9da84c159c3957316839271ea01193ba (diff) | |
download | rockbox-a3868d35d3621e700abfd51de61ac6f83908a472.tar.gz rockbox-a3868d35d3621e700abfd51de61ac6f83908a472.zip |
Continue to update playback status after decoding is complete (the progress bar makes it to 100%!)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8407 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r-- | apps/pcmbuf.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index 2d75185f62..d1835fb197 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c | |||
@@ -83,12 +83,14 @@ struct pcmbufdesc | |||
83 | void (*callback)(void); | 83 | void (*callback)(void); |
84 | } pcmbuffers[NUM_PCM_BUFFERS] IDATA_ATTR; | 84 | } pcmbuffers[NUM_PCM_BUFFERS] IDATA_ATTR; |
85 | 85 | ||
86 | volatile int pcmbuf_read_index; | 86 | static int pcmbuf_read_index; |
87 | volatile int pcmbuf_write_index; | 87 | static int pcmbuf_write_index; |
88 | int pcmbuf_unplayed_bytes IDATA_ATTR; | 88 | static int pcmbuf_unplayed_bytes IDATA_ATTR; |
89 | int pcmbuf_mix_used_bytes; | 89 | static int pcmbuf_mix_used_bytes; |
90 | int pcmbuf_watermark; | 90 | static int pcmbuf_watermark; |
91 | void (*pcmbuf_watermark_event)(int bytes_left); | 91 | static void pcmbuf_under_watermark(int bytes_left); |
92 | static int pcmbuf_num_used_buffers(void); | ||
93 | static void (*position_callback)(int size); | ||
92 | static int last_chunksize; | 94 | static int last_chunksize; |
93 | static long mixpos = 0; | 95 | static long mixpos = 0; |
94 | 96 | ||
@@ -116,7 +118,7 @@ void pcmbuf_set_boost_mode(bool state) | |||
116 | } | 118 | } |
117 | #endif | 119 | #endif |
118 | 120 | ||
119 | int pcmbuf_num_used_buffers(void) | 121 | static int pcmbuf_num_used_buffers(void) |
120 | { | 122 | { |
121 | return (pcmbuf_write_index - pcmbuf_read_index) & NUM_PCM_BUFFERS_MASK; | 123 | return (pcmbuf_write_index - pcmbuf_read_index) & NUM_PCM_BUFFERS_MASK; |
122 | } | 124 | } |
@@ -125,6 +127,10 @@ static void pcmbuf_callback(unsigned char** start, long* size) ICODE_ATTR; | |||
125 | static void pcmbuf_callback(unsigned char** start, long* size) | 127 | static void pcmbuf_callback(unsigned char** start, long* size) |
126 | { | 128 | { |
127 | struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; | 129 | struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; |
130 | |||
131 | if (position_callback) { | ||
132 | position_callback(last_chunksize); | ||
133 | } | ||
128 | 134 | ||
129 | pcmbuf_unplayed_bytes -= last_chunksize; | 135 | pcmbuf_unplayed_bytes -= last_chunksize; |
130 | audiobuffer_free += last_chunksize; | 136 | audiobuffer_free += last_chunksize; |
@@ -159,19 +165,20 @@ static void pcmbuf_callback(unsigned char** start, long* size) | |||
159 | } | 165 | } |
160 | 166 | ||
161 | last_chunksize = *size; | 167 | last_chunksize = *size; |
168 | |||
162 | if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) | 169 | if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) |
163 | { | 170 | { |
164 | if(pcmbuf_watermark_event) | 171 | pcmbuf_under_watermark(pcmbuf_unplayed_bytes); |
165 | { | ||
166 | pcmbuf_watermark_event(pcmbuf_unplayed_bytes); | ||
167 | } | ||
168 | } | 172 | } |
169 | } | 173 | } |
170 | 174 | ||
171 | void pcmbuf_set_watermark(int numbytes, void (*callback)(int bytes_left)) | 175 | void pcmbuf_set_position_callback(void (*callback)(int size)) { |
176 | position_callback = callback; | ||
177 | } | ||
178 | |||
179 | static void pcmbuf_set_watermark_bytes(int numbytes) | ||
172 | { | 180 | { |
173 | pcmbuf_watermark = numbytes; | 181 | pcmbuf_watermark = numbytes; |
174 | pcmbuf_watermark_event = callback; | ||
175 | } | 182 | } |
176 | 183 | ||
177 | bool pcmbuf_add_chunk(void *addr, int size, void (*callback)(void)) | 184 | bool pcmbuf_add_chunk(void *addr, int size, void (*callback)(void)) |
@@ -192,7 +199,7 @@ bool pcmbuf_add_chunk(void *addr, int size, void (*callback)(void)) | |||
192 | return false; | 199 | return false; |
193 | } | 200 | } |
194 | 201 | ||
195 | void pcmbuf_watermark_callback(int bytes_left) | 202 | static void pcmbuf_under_watermark(int bytes_left) |
196 | { | 203 | { |
197 | /* Fill audio buffer by boosting cpu */ | 204 | /* Fill audio buffer by boosting cpu */ |
198 | pcmbuf_boost(true); | 205 | pcmbuf_boost(true); |
@@ -802,9 +809,9 @@ void pcmbuf_crossfade_enable(bool on_off) | |||
802 | crossfade_enabled = on_off; | 809 | crossfade_enabled = on_off; |
803 | 810 | ||
804 | if (crossfade_enabled) { | 811 | if (crossfade_enabled) { |
805 | pcmbuf_set_watermark(pcmbuf_size - (CHUNK_SIZE*6), pcmbuf_watermark_callback); | 812 | pcmbuf_set_watermark_bytes(pcmbuf_size - (CHUNK_SIZE*6)); |
806 | } else { | 813 | } else { |
807 | pcmbuf_set_watermark(PCMBUF_WATERMARK, pcmbuf_watermark_callback); | 814 | pcmbuf_set_watermark_bytes(PCMBUF_WATERMARK); |
808 | } | 815 | } |
809 | } | 816 | } |
810 | 817 | ||