diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-07-16 06:26:29 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-07-16 06:26:29 +0000 |
commit | cda55bbd6f301315193adad04fa020d99c2f087d (patch) | |
tree | d2b6833f5a1d99103dccfd2bc7bb42d0f4769c79 | |
parent | 2ef8a8722d0719abcb4309d6e09af5f9c3b50e2f (diff) | |
download | rockbox-cda55bbd6f301315193adad04fa020d99c2f087d.tar.gz rockbox-cda55bbd6f301315193adad04fa020d99c2f087d.zip |
Correctly read the next track metadata information. Don't crash if
frequency is ever set to 0.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7171 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/codecs/mpa.c | 3 | ||||
-rw-r--r-- | apps/dsp.c | 9 | ||||
-rw-r--r-- | apps/playback.c | 30 |
3 files changed, 27 insertions, 15 deletions
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index 77565679a2..2dcc71922e 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c @@ -114,6 +114,9 @@ enum codec_status codec_start(struct codec_api* api) ci->sleep(1); frequency_divider = ci->id3->frequency / 100; + if (frequency_divider <= 0) + frequency_divider = 441; + ci->configure(DSP_SET_FREQUENCY, (int *)ci->id3->frequency); ci->request_buffer(&size, ci->id3->first_frame_offset); diff --git a/apps/dsp.c b/apps/dsp.c index 404bd15d4f..bd1d04f3d6 100644 --- a/apps/dsp.c +++ b/apps/dsp.c @@ -241,9 +241,9 @@ int process(short *dest, long *src, int samplecount) /* Resample as necessary */ if (dsp_config.frequency > NATIVE_FREQUENCY) - length = upsample(resampled, src, samplecount, &resample[channel]); - else if (dsp_config.frequency < NATIVE_FREQUENCY) length = downsample(resampled, src, samplecount, &resample[channel]); + else if (dsp_config.frequency < NATIVE_FREQUENCY) + length = upsample(resampled, src, samplecount, &resample[channel]); else p = src; @@ -358,6 +358,11 @@ bool dsp_configure(int setting, void *value) { switch (setting) { case DSP_SET_FREQUENCY: + debugf("set frequency: %d\n", (int)value); + if ((int)value == 0) { + dsp_config.frequency = NATIVE_FREQUENCY; + break ; + } memset(resample, 0, sizeof(resample)); dsp_config.frequency = (int)value; resample[0].delta = resample[1].delta = diff --git a/apps/playback.c b/apps/playback.c index b853c80f2c..5257a18018 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -792,7 +792,9 @@ bool read_next_metadata(void) /* Start buffer refilling also because we need to spin-up the disk. */ filling = true; + tracks[next_track].id3.codectype = probe_file_format(trackname); status = get_metadata(&tracks[next_track],fd,trackname,v1first); + tracks[next_track].id3.codectype = 0; track_changed = true; close(fd); @@ -844,7 +846,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) tracks[track_widx].filesize = size; tracks[track_widx].filepos = 0; tracks[track_widx].available = 0; - tracks[track_widx].taginfo_ready = false; + //tracks[track_widx].taginfo_ready = false; tracks[track_widx].playlist_offset = offset; if (buf_widx >= codecbuflen) @@ -1008,7 +1010,7 @@ void audio_play_start(int offset) pcmbuf_set_boost_mode(false); } -void audio_clear_track_entries(void) +void audio_clear_track_entries(bool buffered_only) { int cur_idx, event_count; int i; @@ -1036,12 +1038,12 @@ void audio_clear_track_entries(void) /* Send an event to notify that track has finished. */ if (tracks[cur_idx].event_sent) { - tracks[cur_idx].event_sent = true; event_count--; track_unbuffer_callback(&tracks[cur_idx].id3, event_count == 0); } - - memset(&tracks[cur_idx], 0, sizeof(struct track_info)); + + if (tracks[cur_idx].event_sent || !buffered_only) + memset(&tracks[cur_idx], 0, sizeof(struct track_info)); } } @@ -1051,9 +1053,6 @@ static void generate_postbuffer_events(void) int i; int cur_ridx, event_count; - if (!track_buffer_callback) - return ; - /* At first determine how many unsent events we have. */ cur_ridx = track_ridx; event_count = 0; @@ -1070,7 +1069,10 @@ static void generate_postbuffer_events(void) if (!tracks[cur_ridx].event_sent) { tracks[cur_ridx].event_sent = true; event_count--; - track_buffer_callback(&tracks[cur_ridx].id3, event_count == 0); + /* We still want to set event_sent flags even if not using + event callbacks. */ + if (track_buffer_callback) + track_buffer_callback(&tracks[cur_ridx].id3, event_count == 0); } if (++cur_ridx >= MAX_TRACK) cur_ridx -= MAX_TRACK; @@ -1106,8 +1108,8 @@ void initialize_buffer_fill(void) if (tracks[track_widx].filesize != 0) track_count++; - /* Mark all other entries null. */ - audio_clear_track_entries(); + /* Mark all buffered entries null (not metadata for next track). */ + audio_clear_track_entries(true); } void audio_check_buffer(void) @@ -1209,7 +1211,8 @@ static void audio_stop_playback(void) yield(); pcm_play_pause(true); track_count = 0; - audio_clear_track_entries(); + /* Mark all entries null. */ + audio_clear_track_entries(false); } /* Request the next track with new codec. */ @@ -1352,7 +1355,8 @@ void audio_invalidate_tracks(void) track_count = 1; last_peek_offset = 1; track_widx = track_ridx; - audio_clear_track_entries(); + /* Mark all other entries null (also buffered wrong metadata). */ + audio_clear_track_entries(false); codecbufused = cur_ti->available; buf_widx = buf_ridx + cur_ti->available; if (buf_widx >= codecbuflen) |