mirror of
https://github.com/Polprzewodnikowy/N64FlashcartMenu.git
synced 2024-11-21 18:19:19 +01:00
MP3 player seeking improvement
This commit is contained in:
parent
65a7775964
commit
74dd258b62
@ -40,7 +40,7 @@ static void menu_init (boot_params_t *boot_params) {
|
||||
controller_init();
|
||||
timer_init();
|
||||
rtc_init();
|
||||
audio_init(44100, 3);
|
||||
audio_init(44100, 2);
|
||||
mixer_init(2);
|
||||
rspq_init();
|
||||
rdpq_init();
|
||||
|
@ -6,11 +6,13 @@
|
||||
#include "utils/utils.h"
|
||||
|
||||
#define MINIMP3_IMPLEMENTATION
|
||||
#define MINIMP3_ONLY_MP3
|
||||
#include <minimp3/minimp3_ex.h>
|
||||
#include <minimp3/minimp3.h>
|
||||
|
||||
|
||||
#define MIXER_CHANNEL (0)
|
||||
#define MIXER_CHANNEL (0)
|
||||
#define SEEK_PREDECODE_FRAMES (5)
|
||||
|
||||
|
||||
typedef struct {
|
||||
@ -19,11 +21,12 @@ typedef struct {
|
||||
|
||||
FIL fil;
|
||||
FSIZE_t data_start;
|
||||
int seek_predecode_frames;
|
||||
|
||||
mp3dec_t dec;
|
||||
mp3dec_frame_info_t info;
|
||||
|
||||
uint8_t buffer[16 * 1024];
|
||||
uint8_t buffer[MAX_FREE_FORMAT_FRAME_SIZE];
|
||||
uint8_t *buffer_ptr;
|
||||
size_t buffer_left;
|
||||
|
||||
@ -38,6 +41,7 @@ static mp3player_t *p = NULL;
|
||||
|
||||
static void mp3player_reset_decoder (void) {
|
||||
mp3dec_init(&p->dec);
|
||||
p->seek_predecode_frames = 0;
|
||||
p->buffer_ptr = p->buffer;
|
||||
p->buffer_left = 0;
|
||||
}
|
||||
@ -49,10 +53,6 @@ static void mp3player_fill_buffer (void) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (p->buffer_left >= (MAX_FREE_FORMAT_FRAME_SIZE * 3)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((p->buffer_ptr != p->buffer) && (p->buffer_left > 0)) {
|
||||
memmove(p->buffer, p->buffer_ptr, p->buffer_left);
|
||||
p->buffer_ptr = p->buffer;
|
||||
@ -79,6 +79,11 @@ static void mp3player_wave_read (void *ctx, samplebuffer_t *sbuf, int wpos, int
|
||||
|
||||
mp3dec_decode_frame(&p->dec, p->buffer_ptr, p->buffer_left, buffer, &p->info);
|
||||
|
||||
if (p->seek_predecode_frames > 0) {
|
||||
p->seek_predecode_frames -= 1;
|
||||
memset(buffer, 0, samples * sizeof(short) * p->info.channels);
|
||||
}
|
||||
|
||||
wlen -= samples;
|
||||
}
|
||||
|
||||
@ -229,7 +234,7 @@ bool mp3player_is_playing (void) {
|
||||
}
|
||||
|
||||
bool mp3player_is_finished (void) {
|
||||
return p->loaded && f_eof(&p->fil) && p->buffer_left == 0;
|
||||
return p->loaded && f_eof(&p->fil) && (p->buffer_left == 0);
|
||||
}
|
||||
|
||||
mp3player_err_t mp3player_play (void) {
|
||||
@ -265,7 +270,7 @@ mp3player_err_t mp3player_toggle (void) {
|
||||
}
|
||||
|
||||
void mp3player_mute (bool mute) {
|
||||
float volume = mute ? 0.f : 1.f;
|
||||
float volume = mute ? 0.0f : 1.0f;
|
||||
mixer_ch_set_vol(MIXER_CHANNEL, volume, volume);
|
||||
}
|
||||
|
||||
@ -295,6 +300,8 @@ mp3player_err_t mp3player_seek (int seconds) {
|
||||
mp3player_reset_decoder();
|
||||
mp3player_fill_buffer();
|
||||
|
||||
p->seek_predecode_frames = (position == p->data_start) ? 0 : SEEK_PREDECODE_FRAMES;
|
||||
|
||||
if (p->io_error) {
|
||||
return MP3PLAYER_ERR_IO;
|
||||
}
|
||||
@ -304,7 +311,7 @@ mp3player_err_t mp3player_seek (int seconds) {
|
||||
|
||||
float mp3player_get_duration (void) {
|
||||
if (!p->loaded) {
|
||||
return 0.f;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
return p->duration;
|
||||
@ -312,7 +319,7 @@ float mp3player_get_duration (void) {
|
||||
|
||||
float mp3player_get_bitrate (void) {
|
||||
if (!p->loaded) {
|
||||
return 0.f;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
return p->bitrate;
|
||||
@ -331,7 +338,7 @@ float mp3player_get_progress (void) {
|
||||
// Good enough but not very accurate for variable bitrate files.
|
||||
|
||||
if (!p->loaded) {
|
||||
return 0.f;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
FSIZE_t data_size = f_size(&p->fil) - p->data_start;
|
||||
|
@ -2,11 +2,7 @@
|
||||
#include "views.h"
|
||||
|
||||
|
||||
#define SEEK_SECONDS 10
|
||||
#define SEEK_UNMUTE_TIMEOUT 17
|
||||
|
||||
|
||||
static int unmute_counter;
|
||||
#define SEEK_SECONDS (5)
|
||||
|
||||
|
||||
static char *convert_error_message (mp3player_err_t err) {
|
||||
@ -39,13 +35,6 @@ static void format_elapsed_duration (char *buffer, float elapsed, float duration
|
||||
static void process (menu_t *menu) {
|
||||
mp3player_err_t err;
|
||||
|
||||
if (unmute_counter > 0) {
|
||||
unmute_counter -= 1;
|
||||
if (unmute_counter == 0) {
|
||||
mp3player_mute(false);
|
||||
}
|
||||
}
|
||||
|
||||
err = mp3player_process();
|
||||
if (err != MP3PLAYER_OK) {
|
||||
menu_show_error(menu, convert_error_message(err));
|
||||
@ -57,8 +46,6 @@ static void process (menu_t *menu) {
|
||||
menu_show_error(menu, convert_error_message(err));
|
||||
}
|
||||
} else if (menu->actions.go_left || menu->actions.go_right) {
|
||||
mp3player_mute(true);
|
||||
unmute_counter = SEEK_UNMUTE_TIMEOUT;
|
||||
int seconds = (menu->actions.go_left ? -SEEK_SECONDS : SEEK_SECONDS);
|
||||
err = mp3player_seek(seconds);
|
||||
if (err != MP3PLAYER_OK) {
|
||||
@ -129,8 +116,6 @@ static void deinit (void) {
|
||||
void view_music_player_init (menu_t *menu) {
|
||||
mp3player_err_t err;
|
||||
|
||||
unmute_counter = 0;
|
||||
|
||||
err = mp3player_init();
|
||||
if (err != MP3PLAYER_OK) {
|
||||
menu_show_error(menu, convert_error_message(err));
|
||||
|
Loading…
Reference in New Issue
Block a user