static gint xmms_modplug_read (xmms_xform_t *xform, xmms_sample_t *buf, gint len, xmms_error_t *err) { xmms_modplug_data_t *data; data = xmms_xform_private_data_get (xform); return ModPlug_Read (data->mod, buf, len); }
bool decode_run( audio_chunk & p_chunk, abort_callback & p_abort ) { if (!loop && is_playing == 0) return false; int nbSample = 512; sample_buffer.grow_size( nbSample ); is_playing = ModPlug_Read(m_player, sample_buffer.get_ptr(), nbSample*2); p_chunk.set_data_fixedpoint( sample_buffer.get_ptr(), nbSample * 2, 44100, 2, 32, audio_chunk::channel_config_stereo ); return true; }
/* * Class: com_peculiargames_andmodplug_PlayerThread * Method: ModPlug_JGetSoundData * Signature: ([SI)I */ JNIEXPORT jint JNICALL Java_com_peculiargames_andmodplug_PlayerThread_ModPlug_1JGetSoundData (JNIEnv *env, jobject obj, jshortArray jbuffer, jint size) { jint smpsize = 0; if (currmodFile == NULL) return 0; #ifndef SMALLER_READS if (currsample >= SAMPLEBUFFERSIZE) { /* * Need to read another buffer full of sample data. */ smpsize = ModPlug_Read(currmodFile, samplebuffer, SAMPLEBUFFERSIZE); if (smpsize) { currsample = 0; } } #else // SMALLER_READS /* * In this mode, we read in exactly how much Java requested to improve * frame rate. */ smpsize = ModPlug_Read(currmodFile, samplebuffer, size*sizeof(jshort)); currsample = 0; #endif // SMALLER_READS /* * Now convert the C sample buffer data to a java short array. */ if (size && samplebuffer && (smpsize || currsample < SAMPLEBUFFERSIZE)) { env->SetShortArrayRegion(jbuffer, 0 ,size, (jshort *) (((char *) samplebuffer)+currsample)); currsample += size*sizeof(jshort); return size; } else { return 0; } }
/** * Callback used to provide data to the audio subsystem. * * @param userdata N/A * @param stream Output stream * @param len Length of data to be placed in the output stream */ void audioCallback (void * userdata, unsigned char * stream, int len) { (void)userdata; int count; if (!music_paused) { // Read the next portion of music into the audio stream #if defined(USE_MODPLUG) if (musicFile) ModPlug_Read(musicFile, stream, len); #elif defined(USE_XMP) if (xmp_get_player(xmpC, XMP_PLAYER_STATE) == XMP_STATE_PLAYING) xmp_play_buffer(xmpC, stream, len, 0); #endif } for (count = 0; count < 32; count++) { if (sounds[count].data && (sounds[count].position >= 0)) { // Add the next portion of the sound clip to the audio stream if (len < sounds[count].length - sounds[count].position) { // Play as much of the clip as possible SDL_MixAudio(stream, sounds[count].data + sounds[count].position, len, soundsVolume * SDL_MIX_MAXVOLUME / MAX_VOLUME); sounds[count].position += len; } else { // Play the remainder of the clip SDL_MixAudio(stream, sounds[count].data + sounds[count].position, sounds[count].length - sounds[count].position, soundsVolume * SDL_MIX_MAXVOLUME / MAX_VOLUME); sounds[count].position = -1; } } } return; }
//! \brief Return decoded data int ReadPCM(void* context, uint8_t* pBuffer, int size, int *actualsize) { if (!context) return 1; if ((*actualsize = ModPlug_Read((ModPlugFile*)context, pBuffer, size)) == size) return 0; return 1; }
/** * @brief Decodes a chunk of the previously loaded SPC data into PCM data. * @param decoded_data pointer to where you want the decoded data to be written * @param nb_samples number of samples to write */ void ItDecoder::decode(void* decoded_data, int nb_samples) { // decode from the IT data the specified number of PCM samples int bytes_read = ModPlug_Read(modplug_file, decoded_data, nb_samples); if (bytes_read == 0) { // on some systems, we have to make the music loop manually ModPlug_Seek(modplug_file, 0); } }
static Uint32 MODPLUG_read(Sound_Sample *sample) { Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; ModPlugFile *module = (ModPlugFile *) internal->decoder_private; int retval; retval = ModPlug_Read(module, internal->buffer, internal->buffer_size); if (retval == 0) sample->flags |= SOUND_SAMPLEFLAG_EOF; return(retval); } /* MODPLUG_read */
bool sfMod::Mod::onGetData(sf::SoundStream::Chunk& data) { int read = ModPlug_Read(file_, reinterpret_cast<void*>(&buffer_[0]), SFMOD_BUFFERSIZE); if (read == 0) return false; data.sampleCount = static_cast<size_t>(read / 2); data.samples = &buffer_[0]; return true; }
void gen_audio(float *left, float *right, int count) { int read; int16_t *p; memset(left, 0, sizeof(float)*count); memset(right, 0, sizeof(float)*count); read = ModPlug_Read(module, mod_smpbuf, count*4); read /= 4; p = mod_smpbuf; while(read--) { *left++ = *p++ / 32768.0; *right++ = *p++ / 32768.0; } }
/** * Callback used to provide data to the audio subsystem. * * @param userdata N/A * @param stream Output stream * @param len Length of data to be placed in the output stream */ void audioCallback (void * userdata, unsigned char * stream, int len) { (void)userdata; int count; #ifdef USE_MODPLUG // Read the next portion of music into the audio stream if (musicFile) ModPlug_Read(musicFile, stream, len); #endif for (count = 0; count < nSounds; count++) { if (sounds[count].position >= 0) { // Add the next portion of the sound clip to the audio stream if (len < sounds[count].length - sounds[count].position) { // Play as much of the clip as possible SDL_MixAudio(stream, sounds[count].data + sounds[count].position, len, soundsVolume * SDL_MIX_MAXVOLUME / MAX_VOLUME); sounds[count].position += len; } else { // Play the remainder of the clip SDL_MixAudio(stream, sounds[count].data + sounds[count].position, sounds[count].length - sounds[count].position, soundsVolume * SDL_MIX_MAXVOLUME / MAX_VOLUME); sounds[count].position = -1; } } } return; }
void ModPlay::fillBuffer(size_t buffer) { WAVEHDR* hdr = &headers[buffer]; waveOutUnprepareHeader(hWaveOut, hdr, sizeof(WAVEHDR)); int total = 0; while(total != BUFSIZE) { int read = ModPlug_Read(modFile, hdr->lpData, BUFSIZE - total); if(read == 0) { ModPlug_Seek(modFile, 0); } total += read; } waveOutPrepareHeader(hWaveOut, hdr, sizeof(WAVEHDR)); waveOutWrite(hWaveOut, hdr, sizeof(WAVEHDR)); }
virtual ALuint GetData(ALubyte *data, ALuint bytes) { int ret = ModPlug_Read(modFile, data, bytes); if(ret < 0) return 0; return ret; }
/* Play some of a stream previously started with modplug_play() */ int modplug_playAudio(modplug_data *music, Uint8 *stream, int len) { if (current_output_channels > 2) { int small_len = 2 * len / current_output_channels; int i; Uint8 *src, *dst; i=ModPlug_Read(music->file, stream, small_len); if(i<small_len) { memset(stream+i,0,small_len-i); music->playing=0; } /* and extend to len by copying channels */ src = stream + small_len; dst = stream + len; switch (settings.mBits) { case 8: for ( i=small_len/2; i; --i ) { src -= 2; dst -= current_output_channels; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[0]; dst[3] = src[1]; if (current_output_channels == 6) { dst[4] = src[0]; dst[5] = src[1]; } } break; case 16: for ( i=small_len/4; i; --i ) { src -= 4; dst -= 2 * current_output_channels; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; dst[4] = src[0]; dst[5] = src[1]; dst[6] = src[2]; dst[7] = src[3]; if (current_output_channels == 6) { dst[8] = src[0]; dst[9] = src[1]; dst[10] = src[2]; dst[11] = src[3]; } } break; } } else { int i=ModPlug_Read(music->file, stream, len); if(i<len) { memset(stream+i,0,len-i); music->playing=0; } } if ( music_swap8 ) { Uint8 *dst; int i; dst = stream; for ( i=len; i; --i ) { *dst++ ^= 0x80; } } else if ( music_swap16 ) { Uint8 *dst, tmp; int i; dst = stream; for ( i=(len/2); i; --i ) { tmp = dst[0]; dst[0] = dst[1]; dst[1] = tmp; dst += 2; } } return 0; }
int main(int argc, char* argv[]) { long size; char *filedata; term_size terminal; ModPlugFile *f2; int mlen; struct timeval tvstart; struct timeval tv; struct timeval tvpause, tvunpause; struct timeval tvptotal; char status[161]; char songname[41]; char notpaus[4]; int loop=0; // kontest int songsplayed = 0; int nFiles = 0, fnOffset[100]; int i; ModPlug_Settings settings; ModPlug_GetSettings(&settings); ao_device *device; ao_sample_format format = {0}; int default_driver; ao_initialize(); default_driver = ao_default_driver_id(); for (i=1; i<argc; i++) { /* check if arguments need to be parsed */ if (argv[i][0] == '-') { if (strstr(argv[i],"-h")) { printf("\n"); help(argv[0],0); } else if (strstr(argv[i],"-v")) { versioninfo(); exit(0); } else if (strstr(argv[i],"-l")) { loop=1; continue; } else if (strstr(argv[i],"-ao")) { default_driver = ao_driver_id(argv[++i]); continue; } if (argv[i][1] == '-') { // not a song if (strstr(argv[i],"--help")) { help(argv[0],0); } else if (strstr(argv[i],"--version")) { versioninfo(); exit(0); } continue; } } /* "valid" filename - store it */ fnOffset[nFiles++] = i; } format.bits = 16; format.channels = 2; format.rate = 44100; format.byte_format = AO_FMT_LITTLE; // printf("Default driver = %i\n", default_driver); char buffer[128]; int result, nread; struct pollfd pollfds; int timeout = 1; /* Timeout in msec. */ int pause=0; int mono=0; int bits=0; int song; // [rev--dly--] [sur--dly--] [bas--rng--] int rev=0; // a int revdly=0; // s int sur=0; // d int surdly=0; // y int bas=0; // x int basrng=0; // c /* Initialize pollfds; we're looking at input, stdin */ pollfds.fd = 0; /* stdin */ pollfds.events = POLLIN; /* Wait for input */ if (argc==1) { help(argv[0],1); } if (!get_term_size(STDIN_FILENO,&terminal)) { fprintf(stderr,"warning: failed to get terminal size\n"); } srand(time(NULL)); for (song=0; song<nFiles; song++) { char *filename = argv[fnOffset[song]]; /* -- Open driver -- */ if (default_driver == ao_driver_id("wav")) { device = ao_open_file(default_driver, "output.wav", 1, &format, NULL /*no options*/); } else { device = ao_open_live(default_driver, &format, NULL /* no options */); } if (device == NULL) { fprintf(stderr, "Error opening device. (%s)\n", filename); fprintf(stderr, "ERROR: %i\n", errno); return 1; } printf("%s ",filename); printf("[%d/%d]",song+1,nFiles); filedata = getFileData(filename, &size); if (filedata == NULL) continue; printf(" [%ld]\n",size); // Note: All "Basic Settings" must be set before ModPlug_Load. settings.mResamplingMode = MODPLUG_RESAMPLE_FIR; /* RESAMP */ settings.mChannels = 2; settings.mBits = 16; settings.mFrequency = 44100; settings.mStereoSeparation = 128; settings.mMaxMixChannels = 256; /* insert more setting changes here */ ModPlug_SetSettings(&settings); f2 = ModPlug_Load(filedata, size); if (!f2) { printf("could not load %s\n", filename); close(audio_fd); free(filedata); /* ? */ } else { songsplayed++; /* settings.mFlags=MODPLUG_ENABLE_OVERSAMPLING | \ MODPLUG_ENABLE_NOISE_REDUCTION | \ MODPLUG_ENABLE_REVERB | \ MODPLUG_ENABLE_MEGABASS | \ MODPLUG_ENABLE_SURROUND;*/ // settings.mReverbDepth = 100; /* 0 - 100 */ * [REV--DLY--] // settings.mReverbDelay = 200; /* 40 - 200 ms 00-FF */ // settings.mSurroundDepth = 100; /* 0 - 100 */ [SUR--DLY--] // settings.mSurroundDelay = 40; /* 5 - 40 ms */ // settings.mBassAmount = 100; /* 0 - 100 */ [BAS--RNG--] // settings.mBassRange = 100; /* 10 - 100 hz */ // [REV--DLY--] [SUR--DLY--] [BAS--RNG--] // [rev--dly--] [sur--dly--] [bas--rng--] set_keypress(); strcpy(songname, ModPlug_GetName(f2)); /* if no modplug "name" - use last 41 characters of filename */ if (strlen(songname)==0) { int l = strlen(filename); char *st = filename; if (l >= 41) st = filename + l - 41; strncpy(songname,st,41); songname[40] = 0; } sprintf(status,"[1Gplaying %s (%%d.%%d/%d\") (%%d/%%d/%%d) \b\b\b\b",songname,ModPlug_GetLength(f2)/1000); if (loop) sprintf(status,"[1Glooping %s (%%d.%%d/%d\") (%%d/%%d/%%d) \b\b\b\b",songname,ModPlug_GetLength(f2)/1000); gettimeofday(&tvstart,NULL); tvptotal.tv_sec=tvptotal.tv_usec=0; mlen=1; while(mlen!=0) { if (mlen==0) { break; } if (!pause) { gettimeofday(&tv,NULL); mlen = ModPlug_Read(f2,audio_buffer,BUF_SIZE); if (mlen > 0 && ao_play(device, audio_buffer, mlen) == 0) { perror("audio write"); exit(1); } } printf(status,tv.tv_sec-tvstart.tv_sec-tvptotal.tv_sec,tv.tv_usec/100000,format.rate,format.channels,settings.mBits/*,rev,revdly,sur,surdly,bas,basrng*/); fflush(stdout); if ((mlen==0) && (loop==1)) { /*printf("LOOPING NOW\n");*/ ModPlug_Seek(f2,0); gettimeofday(&tvstart,NULL); mlen=ModPlug_Read(f2,audio_buffer,BUF_SIZE); tvptotal.tv_sec=tvptotal.tv_usec=0; } result = poll(&pollfds, 1, timeout); switch (result) { case 0: /*printf(".");*/ break; case -1: perror("select"); exit(1); default: if (pollfds.revents && POLLIN) { nread = read(0, buffer, 1); /* s/nread/1/2 */ if (nread == 0) { printf("keyboard done\n"); exit(0); } else { buffer[nread] = 0; /* printf("%s", buffer); */ if (buffer[0]=='q') { mlen=0; song=nFiles; } /* quit */ if (buffer[0]=='f') { if ((tv.tv_sec-tvstart.tv_sec-tvptotal.tv_sec+10) < (ModPlug_GetLength(f2)/1000)) { ModPlug_Seek(f2,(tv.tv_sec-tvstart.tv_sec-tvptotal.tv_sec)*1000+10000); tvstart.tv_sec-=10; } } /* forward 10" */ if (buffer[0]=='b') { if ((tv.tv_sec-tvstart.tv_sec-tvptotal.tv_sec-10) > 0) { ModPlug_Seek(f2,(tv.tv_sec-tvstart.tv_sec-tvptotal.tv_sec)*1000-10000); tvstart.tv_sec+=10; } } /* backward 10" */ /* if (buffer[0]=='i') { printf("\n"); } */ /* if (buffer[0]=='a') { rev++; settings.mReverbDepth=rev; ModPlug_SetSettings(&settings); } if (buffer[0]=='A') { rev--; settings.mReverbDepth=rev; ModPlug_SetSettings(&settings); } if (buffer[0]=='s') { revdly++; settings.mReverbDelay=revdly; ModPlug_SetSettings(&settings); } if (buffer[0]=='S') { revdly--; settings.mReverbDelay=revdly; ModPlug_SetSettings(&settings); } if (buffer[0]=='d') { sur++; settings.mSurroundDepth=sur; ModPlug_SetSettings(&settings); } if (buffer[0]=='D') { sur--; settings.mSurroundDepth=sur; ModPlug_SetSettings(&settings); } if (buffer[0]=='y') { surdly++; settings.mSurroundDelay=surdly; ModPlug_SetSettings(&settings); } if (buffer[0]=='Y') { surdly--; settings.mSurroundDelay=surdly; ModPlug_SetSettings(&settings); } if (buffer[0]=='x') { bas++; settings.mBassAmount=bas; ModPlug_SetSettings(&settings); } if (buffer[0]=='X') { bas--; settings.mBassAmount=bas; ModPlug_SetSettings(&settings); } if (buffer[0]=='c') { basrng++; settings.mBassRange=basrng; ModPlug_SetSettings(&settings); } if (buffer[0]=='C') { basrng--; settings.mBassRange=basrng; ModPlug_SetSettings(&settings); } */ if (buffer[0]=='n') { if (song<argc) { mlen=0; pause=0; } } if (buffer[0]=='N') { if (song>1) { song-=2; mlen=0; pause=0; } } if (buffer[0]=='r') { song=(int) ((float)(argc-1)*rand()/(RAND_MAX+1.0)); mlen=0; pause=0; // ioctl(audio_fd,SNDCTL_DSP_RESET,0); /* printf("\n[%d?]\n",song+1); */ } /*if (buffer[0]=='R') { song=(int) ((float)(argc-1)*rand()/(RAND_MAX+1.0)); mlen=0; pause=0; }*/ /* if (buffer[0]=='m') { // mono/stereo mono^=1; if (mono) format.channels=1; else format.channels=2; ioctl(audio_fd,SNDCTL_DSP_RESET,0); if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { perror("SNDCTL_DSP_CHANNELS"); exit(1); } if (mono) settings.mChannels=1; else settings.mChannels=2; ModPlug_SetSettings(&settings); f2=ModPlug_Load(d,size); ModPlug_Seek(f2,(tv.tv_sec-tvstart.tv_sec-tvptotal.tv_sec)*1000+10000); } */ if (buffer[0]=='l') { loop^=1; if (loop) { memcpy(status+4,"loop",4); } else { memcpy(status+4,"play",4); } } /* loop */ if (buffer[0]=='p') { pause^=1; if (pause) { gettimeofday(&tvpause,NULL); memcpy(notpaus,status+4,4); memcpy(status+4,"paus",4); } else { gettimeofday(&tvunpause,NULL); memcpy(status+4,notpaus,4); tvptotal.tv_sec+=tvunpause.tv_sec-tvpause.tv_sec; tvptotal.tv_usec+=tvunpause.tv_usec-tvpause.tv_usec; /* printf(status,tv.tv_sec-tvstart.tv_sec,tv.tv_usec/100000); */ } } /* pause */ } } } } printf("\n"); reset_keypress(); ModPlug_Unload(f2); ao_close(device); fprintf(stderr, "Closing audio device.\n"); free(filedata); } /* valid module */ } /* for */ ao_shutdown(); return 0; }
static void mod_decode(struct decoder *decoder, struct input_stream *is) { ModPlugFile *f; ModPlug_Settings settings; GByteArray *bdatas; struct audio_format audio_format; int ret; char audio_buffer[MODPLUG_FRAME_SIZE]; enum decoder_command cmd = DECODE_COMMAND_NONE; bdatas = mod_loadfile(decoder, is); if (!bdatas) { g_warning("could not load stream\n"); return; } ModPlug_GetSettings(&settings); /* alter setting */ settings.mResamplingMode = MODPLUG_RESAMPLE_FIR; /* RESAMP */ settings.mChannels = 2; settings.mBits = 16; settings.mFrequency = 44100; /* insert more setting changes here */ ModPlug_SetSettings(&settings); f = ModPlug_Load(bdatas->data, bdatas->len); g_byte_array_free(bdatas, TRUE); if (!f) { g_warning("could not decode stream\n"); return; } audio_format_init(&audio_format, 44100, SAMPLE_FORMAT_S16, 2); assert(audio_format_valid(&audio_format)); decoder_initialized(decoder, &audio_format, is->seekable, ModPlug_GetLength(f) / 1000.0); do { ret = ModPlug_Read(f, audio_buffer, MODPLUG_FRAME_SIZE); if (ret <= 0) break; cmd = decoder_data(decoder, NULL, audio_buffer, ret, 0); if (cmd == DECODE_COMMAND_SEEK) { float where = decoder_seek_where(decoder); ModPlug_Seek(f, (int)(where * 1000.0)); decoder_command_finished(decoder); } } while (cmd != DECODE_COMMAND_STOP); ModPlug_Unload(f); }
/** * \brief Decodes a chunk of the previously loaded IT data into PCM data. * \param decoded_data pointer to where you want the decoded data to be written * \param nb_samples number of samples to write */ void ItDecoder::decode(void* decoded_data, int nb_samples) { // decode from the IT data the specified number of PCM samples ModPlug_Read(modplug_file, decoded_data, nb_samples); }
static int S_MODPLUG_CodecReadStream (snd_stream_t *stream, int bytes, void *buffer) { return ModPlug_Read((ModPlugFile*)stream->priv, buffer, bytes); }
static int modplug_read_packet(AVFormatContext *s, AVPacket *pkt) { ModPlugContext *modplug = s->priv_data; if (modplug->video_stream) { modplug->video_switch ^= 1; // one video packet for one audio packet if (modplug->video_switch) { double var_values[VAR_VARS_NB]; var_values[VAR_W ] = modplug->w; var_values[VAR_H ] = modplug->h; var_values[VAR_TIME ] = modplug->packet_count * modplug->ts_per_packet; var_values[VAR_SPEED ] = ModPlug_GetCurrentSpeed (modplug->f); var_values[VAR_TEMPO ] = ModPlug_GetCurrentTempo (modplug->f); var_values[VAR_ORDER ] = ModPlug_GetCurrentOrder (modplug->f); var_values[VAR_PATTERN] = ModPlug_GetCurrentPattern(modplug->f); var_values[VAR_ROW ] = ModPlug_GetCurrentRow (modplug->f); if (av_new_packet(pkt, modplug->fsize) < 0) return AVERROR(ENOMEM); pkt->stream_index = 1; memset(pkt->data, 0, modplug->fsize); if (modplug->print_textinfo) { char intbuf[32]; PRINT_INFO(0, "speed", VAR_SPEED); PRINT_INFO(1, "tempo", VAR_TEMPO); PRINT_INFO(2, "order", VAR_ORDER); PRINT_INFO(3, "pattern", VAR_PATTERN); PRINT_INFO(4, "row", VAR_ROW); PRINT_INFO(5, "ts", VAR_TIME); } if (modplug->expr) { int x, y; for (y = 0; y < modplug->h; y++) { for (x = 0; x < modplug->w; x++) { double color; var_values[VAR_X] = x; var_values[VAR_Y] = y; color = av_expr_eval(modplug->expr, var_values, NULL); pkt->data[y*modplug->linesize + x*3 + 2] |= av_clip((int)color, 0, 0xf)<<4; } } } pkt->pts = pkt->dts = var_values[VAR_TIME]; pkt->flags |= AV_PKT_FLAG_KEY; return 0; } } if (av_new_packet(pkt, AUDIO_PKT_SIZE) < 0) return AVERROR(ENOMEM); if (modplug->video_stream) pkt->pts = pkt->dts = modplug->packet_count++ * modplug->ts_per_packet; pkt->size = ModPlug_Read(modplug->f, pkt->data, AUDIO_PKT_SIZE); if (pkt->size <= 0) { av_free_packet(pkt); return pkt->size == 0 ? AVERROR_EOF : AVERROR(EIO); } return 0; }
// We only support a single song. if (song_index) return NULL; return load_mod_plug(input); } static void destroy(struct sppb_plugin_description *plugin, void *context) { MPSP_DPRINTF("playback: destroy(%p)\n", context); ModPlug_Unload(self); } static spbool decode(struct sppb_plugin_description *plugin, void *context, spbyte *dest, size_t *destlen, spbool *final) { int n = ModPlug_Read(self, dest, *destlen); MPSP_DPRINTF("playback: decode(%p, %zu): %d\n", dest, *destlen, n); *destlen = (size_t) n; if (!n) *final = sptrue; return sptrue; } static spbool seek(struct sppb_plugin_description *plugin, void *context, unsigned int sample) { MPSP_DPRINTF("playback: seek(%u)\n", sample); ModPlug_Seek(self, (sample / get_sampling_rate()) * 1000);