mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-20 09:04:43 +00:00
77 lines
2.1 KiB
C
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
|