Пример #1
0
 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;
 }
Пример #2
0
 void getOggData(float **dst,int num_frames){
   float **sound;
   long read=ov_read_float(&oggvorbisfile,&sound,num_frames,&current_oggsection);
   if(read==0){
     ov_pcm_seek(&oggvorbisfile,0);
     read=ov_read_float(&oggvorbisfile,&sound,num_frames,&current_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);
   }
 }
Пример #3
0
	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;
			}
		}
	}
Пример #4
0
  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);
    }

  }