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));
}
Esempio n. 2
0
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;
}
Esempio n. 3
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();
}
Esempio n. 4
0
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;
}