#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