1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-09-16 15:34:03 +00:00
QB64-PE/internal/c/parts/audio/decode/mp3_mini/src.c
2022-05-06 13:20:30 -04:00

77 lines
2.1 KiB
C

#ifndef DEPENDENCY_AUDIO_DECODE_MP3
// Stubs:
//(none required)
#else
extern "C" {
# ifdef QB64_BACKSLASH_FILESYSTEM
# include "src\\minimp3.h"
# else
# include "src/minimp3.h"
# endif
}
snd_sequence_struct *snd_decode_mp3(uint8 *buffer, int32 bytes) {
mp3_decoder_t mp3;
mp3_info_t info;
memset(&info, 0, sizeof(mp3_info_t));
unsigned char *stream_pos;
int bytes_left;
int bytes_read;
int sample_buffer_allocated_bytes = 2000000;
int16 *sample_buffer = (int16 *)malloc(2000000);
int16 *sample_buffer_offset;
bytes_left = bytes;
stream_pos = (unsigned char *)buffer;
mp3 = mp3_create();
int bytes_out = 0;
int firstTry = 1;
sample_buffer_offset = sample_buffer;
mp3getmore:
bytes_read = mp3_decode((void **)mp3, stream_pos, bytes_left, sample_buffer_offset, &info);
if (firstTry == 1 && info.audio_bytes <= 0) {
free(sample_buffer);
return NULL;
}
firstTry = 0;
bytes_left -= bytes_read;
stream_pos += bytes_read;
sample_buffer_offset = (int16 *)(((uint8 *)sample_buffer_offset) + info.audio_bytes);
bytes_out += info.audio_bytes;
if (bytes_out + 1000000 > sample_buffer_allocated_bytes) {
sample_buffer_allocated_bytes += 1000000;
sample_buffer = (int16 *)realloc(sample_buffer, sample_buffer_allocated_bytes);
sample_buffer_offset = (int16 *)(((uint8 *)sample_buffer) + bytes_out);
}
if (bytes_left > 0 && bytes_read != 0)
goto mp3getmore;
// attach bufout to new sequence
static int32 seq_handle;
seq_handle = list_add(snd_sequences);
static snd_sequence_struct *seq;
seq = (snd_sequence_struct *)list_get(snd_sequences, seq_handle);
memset(seq, 0, sizeof(snd_sequence_struct));
seq->references = 1;
seq->data = (uint16 *)sample_buffer;
seq->data_size = bytes_out;
seq->channels = info.channels;
seq->endian = 0; // native
seq->is_unsigned = 0;
seq->sample_rate = info.sample_rate;
seq->bits_per_sample = 16;
return seq;
}
#endif