long getOggResampledData_callback(void *cb_data, float **data){ static float ret[1024]; static float ret3[1024]; static float *ret2[2]={&ret[0],&ret[512]}; getOggData(ret2,512); for(int i=0;i<512;i++){ ret3[i*2]=ret2[0][i]; ret3[i*2+1]=ret2[1][i]; } *data=&ret3[0]; return 512; }
void getOggData(float **dst,int num_frames){ float **sound; long read=ov_read_float(&oggvorbisfile,&sound,num_frames,¤t_oggsection); if(read==0){ ov_pcm_seek(&oggvorbisfile,0); read=ov_read_float(&oggvorbisfile,&sound,num_frames,¤t_oggsection); } memcpy(dst[0],sound[0],read*sizeof(float)); memcpy(dst[1],sound[1],read*sizeof(float)); if(read<num_frames){ float *newdst[2]={dst[0]+read,dst[1]+read}; getOggData(newdst,num_frames-read); } }
void WavStreamInstance::getAudio(float *aBuffer, unsigned int aSamples) { unsigned int channels = mChannels; if (mFile == NULL) return; if (mOgg) { unsigned int offset = 0; if (mOggFrameOffset < mOggFrameSize) { int b = getOggData(mOggOutputs, aBuffer, aSamples, aSamples, mOggFrameSize, mOggFrameOffset, channels); mOffset += b; offset += b; mOggFrameOffset += b; } while (offset < aSamples) { mOggFrameSize = stb_vorbis_get_frame_float(mOgg, NULL, &mOggOutputs); mOggFrameOffset = 0; int b; b = getOggData(mOggOutputs, aBuffer + offset, aSamples - offset, aSamples, mOggFrameSize, mOggFrameOffset, channels); mOffset += b; offset += b; mOggFrameOffset += b; if (mOffset >= mParent->mSampleCount) { if (mFlags & AudioSourceInstance::LOOPING) { stb_vorbis_seek_start(mOgg); mOffset = aSamples - offset; mLoopCount++; } else { unsigned int i; for (i = 0; i < channels; i++) memset(aBuffer + offset + i * aSamples, 0, sizeof(float) * (aSamples - offset)); mOffset += aSamples - offset; offset = aSamples; } } } } else { unsigned int copysize = aSamples; if (copysize + mOffset > mParent->mSampleCount) { copysize = mParent->mSampleCount - mOffset; } getWavData(mFile, aBuffer, copysize, aSamples, channels, mParent->mChannels, mParent->mBits); if (copysize != aSamples) { if (mFlags & AudioSourceInstance::LOOPING) { mFile->seek(mParent->mDataOffset); getWavData(mFile, aBuffer + copysize, aSamples - copysize, aSamples, channels, mParent->mChannels, mParent->mBits); mOffset = aSamples - copysize; mLoopCount++; } else { unsigned int i; for (i = 0; i < channels; i++) memset(aBuffer + copysize + i * aSamples, 0, sizeof(float) * (aSamples - copysize)); mOffset += aSamples; } } else { mOffset += aSamples; } } }
void audioDeviceIOCallback(const float ** inputChannelData, int totalNumInputChannels, float ** outputChannelData, int totalNumOutputChannels, int numSamples ) { // First find the real number of totalNumOutputChannels. { int i; for(i=0;i<totalNumOutputChannels;i++) if(outputChannelData[i]==NULL) break; totalNumOutputChannels=i; } if(totalNumOutputChannels<2) //??? return; if(isplaying_ogg==true && prefs_soundonoff==true){ if( (fabs(((double)R) - samplerate)) > 0.1) getOggResampledData(outputChannelData,numSamples); else getOggData(outputChannelData,numSamples); return; } int num_channels=getSourceNumChannels(); if(num_channels>totalNumOutputChannels) num_channels=totalNumOutputChannels; if(pleasestop==true) isreadingdata=false; if(isreadingdata==false){ for(int ch=0;ch<totalNumOutputChannels;ch++){ zeromem (outputChannelData[ch], sizeof (float) * numSamples); } return; } if( (fabs(((double)R) - samplerate)) > 0.1){ insertDataResample(outputChannelData,numSamples,num_channels); }else{ insertData(outputChannelData,numSamples,num_channels); } if(synthandsave_normalize_gain) for(int ch=0;ch<num_channels;ch++) for(int i=0;i<numSamples;i++) outputChannelData[ch][i]*=normalize_val; // Play mono files in both loudspeakers. if(isplaying_ogg==false && getSourceNumChannels()==1 && totalNumOutputChannels>1) memcpy(outputChannelData[1],outputChannelData[0],sizeof(float)*numSamples); for(int ch=JP_MAX(2,getSourceNumChannels());ch<totalNumOutputChannels;ch++){ zeromem(outputChannelData[ch], sizeof (float) * numSamples); } }