void UPhyaCollisionHandler::ProceduralWaveUnderflow(USoundWaveProcedural* InProceduralWave, int32 SamplesRequired) { check(ProceduralWave == InProceduralWave); const int32 QueuedSamples = ProceduralWave->GetAvailableAudioByteCount()/sizeof(uint16); const int32 SamplesNeeded = SamplesRequired - QueuedSamples; const int32 BlocksNeeded = FMath::CeilToInt(SamplesNeeded/BlockSize); UE_LOG(LogTemp, Log, TEXT("Creating %d blocks for %s"), BlocksNeeded, *GetWorld()->GetPathName()); TArray<int16> SampleData; SampleData.AddUninitialized(BlocksNeeded * BlockSize); int32 CurrSample = 0; for(int32 BlockIdx=0; BlockIdx<BlocksNeeded; BlockIdx++) { paBlock* AudioBlock = paTick(); float* AudioData = AudioBlock->getStart(); for(int32 SampleIdx=0; SampleIdx<BlockSize; SampleIdx++) { SampleData[CurrSample] = (int16)AudioData[SampleIdx]; CurrSample++; //UE_LOG(LogTemp, Log, TEXT("%d:%f"), CurrSample, SampleData[CurrSample]); } } ProceduralWave->QueueAudio((uint8*)SampleData.GetData(), SampleData.Num() * sizeof(int16)); }
PHYA_API int paAdaptiveAutoGenerate() { if ( paScene::outputStream->calcnDeviceBufferSamplesToFillAdaptively() == -1 ) return -1; // Device buffer not ready for writing. // Calculate audioblocks until there are enough to fill the device buffer // upto the amount worked out internally in the AIO library. while( paScene::outputStream->writeSamplesWithoutBlocking(paTick()->getStart(), paBlock::nFrames) != -1 ); return 0; }
PHYA_API paFloat* paGenerate() { paBlock* output = paTick(); if (paScene::outputStreamIsOpen) { if (_limiter) _limiter->tick(output); paScene::outputStream->writeSamples(output->getStart(), paBlock::nFrames); } // Allow the user to pass audio generated by paTick() to their own output stream. if (_monoCallback) _monoCallback(output->getStart()); return output->getStart(); }
static PHYA_THREAD_RETURN_TYPE _audioThread(void*) { paBlock* output = new paBlock; while(paScene::audioThreadIsOn) { paEnterCriticalSection(&_critSec); // Don't use paLock() because the locked flag is just for use by main thread. output = paTick(); paLeaveCriticalSection(&_critSec); if (_limiter) _limiter->tick(output); // Allow the user to pass audio generated by paTick() to their own output stream. if (_monoCallback) _monoCallback(output->getStart()); if (paScene::outputStreamIsOpen) paScene::outputStream->writeSamples(output->getStart(), paBlock::nFrames); } // printf("thread stops\n"); return 0; }