shithub: mp3dec

Download patch

ref: 5ebaaccfd759a12e198dae924bd5c4b6b7563ecf
parent: 624da635861e306714c06cf22a39911183d5d90e
author: lieff <[email protected]>
date: Sun Feb 16 15:39:15 EST 2020

player: move to mp3dec_ex

--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 fate-suite.ffmpeg.org
+player/SDL
 minimp3
 minimp3_arm
 *.gcda
--- a/minimp3_ex.h
+++ b/minimp3_ex.h
@@ -455,7 +455,7 @@
     if (!io || !buf || (size_t)-1 == buf_size || buf_size < MINIMP3_BUF_SIZE)
         return MP3D_E_PARAM;
     size_t filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data), consumed = 0;
-    uint64_t readed = 0, frames = 0;
+    uint64_t readed = 0;
     mp3dec_frame_info_t frame_info;
     int eof = 0;
     memset(&frame_info, 0, sizeof(frame_info));
@@ -500,7 +500,6 @@
         frame_info.frame_bytes = frame_size;
 
         readed += i;
-        frames++;
         if (callback)
         {
             if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info)))
@@ -765,8 +764,8 @@
         {   /* count decoded samples to properly cut padding */
             if (dec->cur_sample + to_copy >= dec->detected_samples)
                 to_copy = dec->detected_samples - dec->cur_sample;
-            dec->cur_sample += to_copy;
         }
+        dec->cur_sample += to_copy;
         memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));
         buf += to_copy;
         dec->buffer_consumed += to_copy;
@@ -820,8 +819,8 @@
             {   /* ^ handle padding */
                 if (dec->cur_sample + to_copy >= dec->detected_samples)
                     to_copy = dec->detected_samples - dec->cur_sample;
-                dec->cur_sample += to_copy;
             }
+            dec->cur_sample += to_copy;
             memcpy(buf, dec->buffer + dec->buffer_consumed, to_copy*sizeof(mp3d_sample_t));
             buf += to_copy;
             dec->buffer_consumed += to_copy;
--- a/player/decode.c
+++ b/player/decode.c
@@ -8,9 +8,8 @@
 #include <fcntl.h>
 #include <stdlib.h>
 #include <math.h>
-#include "decode.h"
 #define MINIMP3_IMPLEMENTATION
-#include "../minimp3.h"
+#include "decode.h"
 
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
 
@@ -17,7 +16,7 @@
 static void get_spectrum(decoder *dec, int numch)
 {
     int i, ch, band;
-    const mp3dec_t *d = &dec->mp3d;
+    const mp3dec_t *d = &dec->mp3d.mp3d;
     // Average spectrum power for 32 frequency band
     for (ch = 0; ch < numch; ch++)
     {
@@ -53,38 +52,8 @@
 
 void decode_samples(decoder *dec, uint8_t *buf, int bytes)
 {
-    if (dec->pcm_bytes - dec->pcm_copied)
-    {
-        int to_copy = MIN(dec->pcm_bytes - dec->pcm_copied, bytes);
-        memcpy(buf, (uint8_t*)dec->pcm + dec->pcm_copied, to_copy);
-        buf   += to_copy;
-        bytes -= to_copy;
-        dec->pcm_copied += to_copy;
-    }
-    if (!bytes)
-        return;
-    do
-    {
-        int samples = mp3dec_decode_frame(&dec->mp3d, dec->mp3_buf + dec->pos, dec->mp3_size - dec->pos, dec->pcm, &dec->info);
-        dec->pos += dec->info.frame_bytes;
-        if (samples)
-        {
-            get_spectrum(dec, dec->info.channels);
-            dec->pcm_bytes = samples*2*dec->info.channels;
-            dec->pcm_copied = MIN(dec->pcm_bytes, bytes);
-            memcpy(buf, dec->pcm, dec->pcm_copied);
-            buf   += dec->pcm_copied;
-            bytes -= dec->pcm_copied;
-            if (!dec->mp3_rate)
-                dec->mp3_rate = dec->info.hz;
-            if (!dec->mp3_channels)
-                dec->mp3_channels = dec->info.channels;
-            if (dec->mp3_rate != dec->info.hz || dec->mp3_channels != dec->info.channels)
-                break;
-        }
-    } while (dec->info.frame_bytes && bytes);
-    if (bytes)
-        memset(buf, 0, bytes);
+    memset(buf, 0, bytes);
+    mp3dec_ex_read(&dec->mp3d, (mp3d_sample_t*)buf, bytes/sizeof(mp3d_sample_t));
 }
 
 int open_dec(decoder *dec, const char *file_name)
@@ -94,38 +63,14 @@
 
     memset(dec, 0, sizeof(*dec));
 
-    struct stat st;
-retry_open:
-    dec->file = open(file_name, O_RDONLY);
-    if (dec->file < 0 && (errno == EAGAIN || errno == EINTR))
-        goto retry_open;
-    if (dec->file < 0 || fstat(dec->file, &st) < 0)
-    {
-        close_dec(dec);
+    mp3dec_ex_open(&dec->mp3d, file_name, MP3D_SEEK_TO_SAMPLE);
+    if (!dec->mp3d.samples)
         return 0;
-    }
-
-    dec->mp3_size = st.st_size;
-retry_mmap:
-    dec->mp3_buf = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, dec->file, 0);
-    if (MAP_FAILED == dec->mp3_buf && (errno == EAGAIN || errno == EINTR))
-        goto retry_mmap;
-    if (MAP_FAILED == dec->mp3_buf)
-    {
-        close_dec(dec);
-        return 0;
-    }
-    mp3dec_init(&dec->mp3d);
     return 1;
 }
 
 int close_dec(decoder *dec)
 {
-    if (dec->mp3_buf)
-        free(dec->mp3_buf);
-    if (dec->mp3_buf && MAP_FAILED != dec->mp3_buf)
-        munmap(dec->mp3_buf, dec->mp3_size);
-    if (dec->file)
-        close(dec->file);
+    mp3dec_ex_close(&dec->mp3d);
     memset(dec, 0, sizeof(*dec));
 }
--- a/player/decode.h
+++ b/player/decode.h
@@ -1,6 +1,6 @@
 #pragma once
 #include <stdint.h>
-#include "../minimp3.h"
+#include "../minimp3_ex.h"
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -10,14 +10,9 @@
 
 typedef struct decoder
 {
-    mp3dec_t mp3d;
-    mp3dec_frame_info_t info;
-    uint8_t *mp3_buf;
-    size_t mp3_size, pos;
-    int file, pcm_bytes, pcm_copied, mp3_rate, mp3_channels;
+    mp3dec_ex_t mp3d;
     float mp3_duration;
     float spectrum[32][2]; // for visualization
-    short pcm[MINIMP3_MAX_SAMPLES_PER_FRAME];
 } decoder;
 
 extern decoder _dec;
@@ -25,7 +20,6 @@
 int open_dec(decoder *dec, const char *file_name);
 int close_dec(decoder *dec);
 void decode_samples(decoder *dec, uint8_t *buf, int bytes);
-void start_parser(PARSE_GET_FILE_CB fcb, void *fcb_user, PARSE_INFO_CB icb, void *icb_user);
 
 #ifdef __cplusplus
 }
--- a/player/player.cpp
+++ b/player/player.cpp
@@ -98,7 +98,7 @@
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
 #endif
-    _mainWindow = SDL_CreateWindow("Lion Audio Player", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 400, 600, SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_ALLOW_HIGHDPI);
+    _mainWindow = SDL_CreateWindow("minimp3", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 400, 600, SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_ALLOW_HIGHDPI);
     if (!_mainWindow)
     {
         printf("error: create window failed: %s\n", SDL_GetError()); 
@@ -197,6 +197,16 @@
             }
         }
         nk_button_pop_behavior(ctx);
+        static size_t progress = 0;
+        uint64_t cur_sample = _dec.mp3d.cur_sample;
+        progress = cur_sample;
+        nk_progress(ctx, &progress, _dec.mp3d.samples, NK_MODIFIABLE);
+        if (progress != cur_sample)
+        {
+            SDL_PauseAudio(1);
+            mp3dec_ex_seek(&_dec.mp3d, progress);
+            SDL_PauseAudio(0);
+        }
 
         if (nk_tree_push(ctx, NK_TREE_TAB, "Playlist", NK_MAXIMIZED))
         {