int wmain( int argc, wchar_t * argv[] ) { #else int main( int argc, char * argv[] ) { #endif FILE * file = 0; openmpt_module * mod = 0; size_t count = 0; PaStream * stream = 0; (void)argc; #if ( defined( _WIN32 ) || defined( WIN32 ) ) && ( defined( _UNICODE ) || defined( UNICODE ) ) file = _wfopen( argv[1], L"rb" ); #else file = fopen( argv[1], "rb" ); #endif mod = openmpt_module_create2( openmpt_stream_get_file_callbacks(), file, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); fclose( file ); Pa_Initialize(); Pa_OpenDefaultStream( &stream, 0, 2, paInt16 | paNonInterleaved, SAMPLERATE, paFramesPerBufferUnspecified, NULL, NULL ); Pa_StartStream( stream ); while ( 1 ) { count = openmpt_module_read_stereo( mod, SAMPLERATE, BUFFERSIZE, left, right ); if ( count == 0 ) { break; } Pa_WriteStream( stream, buffers, (unsigned long)count ); } Pa_StopStream( stream ); Pa_CloseStream( stream ); Pa_Terminate(); openmpt_module_destroy( mod ); return 0; }
int main( int argc, char * argv[] ) { FILE * file = 0; size_t size = 0; void * data = 0; openmpt_module * mod = 0; size_t count = 0; PaStream * stream = 0; PaStreamParameters streamparameters; memset( &streamparameters, 0, sizeof( PaStreamParameters ) ); (void)argc; file = fopen( argv[1], "rb" ); fseek( file, 0, SEEK_END ); size = ftell( file ); fseek( file, 0, SEEK_SET ); data = malloc( size ); size = fread( data, 1, size, file ); fclose( file ); mod = openmpt_module_create_from_memory( data, size, NULL, NULL, NULL ); free( data ); Pa_Initialize(); streamparameters.device = Pa_GetDefaultOutputDevice(); streamparameters.channelCount = 2; streamparameters.sampleFormat = paInt16 | paNonInterleaved; streamparameters.suggestedLatency = Pa_GetDeviceInfo( streamparameters.device )->defaultHighOutputLatency; Pa_OpenStream( &stream, NULL, &streamparameters, SAMPLERATE, paFramesPerBufferUnspecified, 0, NULL, NULL ); Pa_StartStream( stream ); while ( 1 ) { count = openmpt_module_read_stereo( mod, SAMPLERATE, BUFFERSIZE, left, right ); if ( count == 0 ) { break; } Pa_WriteStream( stream, buffers, count ); } Pa_StopStream( stream ); Pa_CloseStream( stream ); Pa_Terminate(); openmpt_module_destroy( mod ); return 0; }
LIBOPENMPT_MODPLUG_API int ModPlug_Read(ModPlugFile* file, void* buffer, int size) { int framesize; int framecount; int frames; int rendered; int frame; int channel; int totalrendered; signed short* in; signed int* mixbuf; unsigned char* buf8; signed short* buf16; signed int* buf32; if(!file) return 0; framesize = file->settings.mBits/8*file->settings.mChannels; framecount = size/framesize; buf8 = buffer; buf16 = buffer; buf32 = buffer; totalrendered = 0; while(framecount>0){ frames = framecount; if(frames>BUFFER_COUNT){ frames = BUFFER_COUNT; } if(file->settings.mChannels==1){ rendered = (int)openmpt_module_read_mono(file->mod,file->settings.mFrequency,frames,&file->buf[frames*0]); }else if(file->settings.mChannels==2){ rendered = (int)openmpt_module_read_stereo(file->mod,file->settings.mFrequency,frames,&file->buf[frames*0],&file->buf[frames*1]); }else if(file->settings.mChannels==4){ rendered = (int)openmpt_module_read_quad(file->mod,file->settings.mFrequency,frames,&file->buf[frames*0],&file->buf[frames*1],&file->buf[frames*2],&file->buf[frames*3]); }else{ return 0; } in = file->buf; if(file->mixerproc&&file->mixerbuf){ mixbuf=file->mixerbuf; for(frame=0;frame<frames;frame++){ for(channel=0;channel<file->settings.mChannels;channel++){ *mixbuf = in[frames*channel+frame]<<(32-16-1-MIXING_ATTENUATION); mixbuf++; } } file->mixerproc(file->mixerbuf,file->settings.mChannels*frames,file->settings.mChannels); mixbuf=file->mixerbuf; for(frame=0;frame<frames;frame++){ for(channel=0;channel<file->settings.mChannels;channel++){ in[frames*channel+frame] = *mixbuf>>(32-16-1-MIXING_ATTENUATION); mixbuf++; } } } if(file->settings.mBits==8){ for(frame=0;frame<frames;frame++){ for(channel=0;channel<file->settings.mChannels;channel++){ *buf8 = in[frames*channel+frame]/256+0x80; buf8++; } } }else if(file->settings.mBits==16){ for(frame=0;frame<frames;frame++){ for(channel=0;channel<file->settings.mChannels;channel++){ *buf16 = in[frames*channel+frame]; buf16++; } } }else if(file->settings.mBits==32){ for(frame=0;frame<frames;frame++){ for(channel=0;channel<file->settings.mChannels;channel++){ *buf32 = in[frames*channel+frame] << (32-16-1-MIXING_ATTENUATION); buf32++; } } }else{ return 0; } totalrendered += rendered; framecount -= frames; if(!rendered) break; }