1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-09-02 11:00:16 +00:00
qb64/internal/c/parts/audio/decode/mp3_mini/src.c
Luke Ceddia 2089a95b8b Separate left/right audio channels for stereo audio files.
No _SNDRAW or PLAY yet. Also removed need for sound capability strings.
2017-08-10 22:05:16 +10:00

76 lines
1.8 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