JD2022-TU1/main/extern/Raki/Source/RakiTests/TestSourceStreaming/TestSourceStreaming_Sine.cpp

318 lines
7.1 KiB
C++

#include "Precompiled.h"
#include "RakiEngine/Data/MemoryBlock/MemoryBlock.h"
#include "RakiEngine/Data/WaveFile/BinWaveData/BinWaveData.h"
#include "RakiEngine/Data/WaveFile/RiffChunkManager.h"
#include "RakiEngine/Sounds/PCMStreamSource.h"
#include "RakiEngine/Sounds/StreamBufferInfo.h"
#include "RakiEngine/Sounds/SoftwareEngine/StreamSoftwareSound.h"
#include "RakiEngine/Sources/SineSource.h"
#include "RakiEngine/Sources/Synth/MonophonicSynth.h"
#include "RakiTests/Sounds/PCMDataProvider.h"
#include "RakiEngine/Utils/Calcs.h"
#if defined ( RAKI_USING_XAUDIO2 )
#include "RakiEngine/Sounds/_XAudio2/PCMStreamSoundNative.h"
#elif defined ( RAKI_PLATFORM_PS3 )
#include <cell/mstream.h>
#include "RakiEngine/Sounds/_PS3/BufferSoundNative_PS3.h"
#include "RakiEngine/Sounds/_PS3/PCMStreamSoundNative_PS3.h"
#include "RakiTests/Sounds/MP3DataProvider.h"
#elif defined ( RAKI_PLATFORM_WII )
#include <revolution/vi.h>
#include "RakiEngine/Sounds/_Wii/BufferSoundNative_Wii.h"
#include "RakiEngine/Sounds/_Wii/PCMStreamSoundNative_Wii.h"
#elif defined ( RAKI_PLATFORM_CAFE )
#include "RakiEngine/Sounds/_Cafe/PCMStreamSoundNative_Cafe.h"
#include "RakiTests/_Cafe/Memory/SimpleHeap_Cafe.h"
#endif
#if defined ( RAKI_PLATFORM_WIN32 )
#include "RakiTests/_Win32/CoInitializeInitObject.h"
#endif // ( RAKI_PLATFORM_WIN32 )
#include "RakiTests/Initializer/TestInitializer.h"
namespace raki
{
extern void SystemAllocator_Initialize();
#define STREAMINGSOURCE_NB_CHANNELS 2
#define STREAMINGSOURCE_MAIN_THREAD_UPDATE_PERIOD_MILLISECONDS 100
#define STREAMINGSOURCE_BUFFER_SAMPLESIZE ( STREAMINGSOURCE_MAIN_THREAD_UPDATE_PERIOD_MILLISECONDS * RAKI_NATIVE_SAMPLING_RATE / 800 ) // should be divided by 1000 for milliseconds - multiple by a bit more than 1.2 for safety
#define STREAMINGSOURCE_BUFFER_ALIGNED_SAMPLESIZE ( ( STREAMINGSOURCE_BUFFER_SAMPLESIZE + 63 ) - ( ( STREAMINGSOURCE_BUFFER_SAMPLESIZE + 63 ) % 64 ) ) // should be divided by 1000 for milliseconds - multiple by a bit more than 1.2 for safety
#define STREAMINGSOURCE_BUFFER_BYTESIZE ( STREAMINGSOURCE_BUFFER_ALIGNED_SAMPLESIZE * 2 * STREAMINGSOURCE_NB_CHANNELS )
void TestSourceStreaming_Sine();
void TestSourceStreaming_Sine()
{
bool buffersAllocated = false;
#if defined ( RAKI_PLATFORM_WIN32 )
#if defined ( RAKI_USING_SOFTWARE_ENGINE )
StreamSoftwareSound pcmStreamSound;
#else
PCMStreamSoundNative pcmStreamSound;
#endif
// pcmStreamSound.getStreamBufferInfo()->setStreamUpdateClient( &testUpdateClient );
buffersAllocated = pcmStreamSound.allocateBuffers( STREAMINGSOURCE_BUFFER_BYTESIZE );
RAKI_ASSERT( buffersAllocated );
#elif defined ( RAKI_PLATFORM_XB360 )
PCMStreamSoundNative pcmStreamSound;
buffersAllocated = pcmStreamSound.allocateBuffers( STREAMINGSOURCE_BUFFER_BYTESIZE );
RAKI_ASSERT( buffersAllocated );
#elif defined ( RAKI_PLATFORM_WII ) || defined ( RAKI_PLATFORM_CAFE )
PCMStreamSoundNative pcmStreamSound( STREAMINGSOURCE_NB_CHANNELS );
buffersAllocated = pcmStreamSound.allocateBuffers( STREAMINGSOURCE_BUFFER_BYTESIZE );
RAKI_ASSERT( buffersAllocated );
#elif defined ( RAKI_PLATFORM_PS3 )
PCMStreamSoundNative pcmStreamSound;
// mp3StreamSound.getStreamBufferInfo()->setStreamUpdateClient( &testUpdateClient );
buffersAllocated = pcmStreamSound.allocateBuffers( STREAMINGSOURCE_BUFFER_BYTESIZE );
RAKI_ASSERT( buffersAllocated );
#endif
const bool isMusic = false;
const bool isLooping = false;
SoundParams soundParams( isMusic, isLooping );
SineSource source( STREAMINGSOURCE_NB_CHANNELS );
bool create = pcmStreamSound.createVoice( &source, soundParams );
RAKI_ASSERT( create );
pcmStreamSound.prepare( &source );
pcmStreamSound.updateRouting( true );
pcmStreamSound.start();
bool isPlaying = pcmStreamSound.isPlaying();
RAKI_ASSERT( isPlaying );
int count = 0;
for ( ;; )
{
bool isPlaying = false;
#ifdef RAKI_PLATFORM_WII
VIWaitForRetrace();
#else // RAKI_PLATFORM_WII
Thread::sleep( 25 );
#endif // RAKI_PLATFORM_WII
pcmStreamSound.update();
#if defined ( RAKI_PLATFORM_WIN32 )
isPlaying |= pcmStreamSound.isPlaying();
#else
isPlaying |= pcmStreamSound.isPlaying();
#endif
// if ( !isPlaying )
// break;
++count;
}
/*
pcmStreamSound.stop();
// XAudio2 doc: Stop is always asynchronous, even if called within a callback
Thread::sleep( 5000 );
pcmStreamSound.destroyVoice();
Thread::sleep( 500 );
*/
}
} // namespace raki
#if defined ( RAKI_PLATFORM_CAFE )
u32 running_core;
u32 main_core;
u32 first_subcore;
u32 second_subcore;
u32 wait_main_core;
u32 wait_first_subcore;
u32 wait_second_subcore;
OSRendezvous rendezvous;
void
SetupCoreIds(void)
{
running_core = OSGetCoreId();
main_core = OSGetMainCoreId();
first_subcore = 0;
second_subcore = 2;
wait_main_core = OS_WAIT_CORE_MAIN;
wait_first_subcore = OS_WAIT_CORE_SUB1;
wait_second_subcore = OS_WAIT_CORE_SUB2;
if (main_core == 0)
{
first_subcore = 1;
second_subcore = 2;
wait_main_core = OS_WAIT_CORE_SUB1;
wait_first_subcore = OS_WAIT_CORE_MAIN;
wait_second_subcore = OS_WAIT_CORE_SUB2;
}
else
if (main_core == 2)
{
first_subcore = 0;
second_subcore = 1;
wait_main_core = OS_WAIT_CORE_SUB2;
wait_first_subcore = OS_WAIT_CORE_SUB1;
wait_second_subcore = OS_WAIT_CORE_MAIN;
}
}
int run_demo (int intArg, void *ptrArg)
{
raki::SimpleHeap_Cafe::init();
raki::TestInitializer initializer;
raki::TestSourceStreaming_Sine();
return 0;
}
#endif
#if defined ( RAKI_USING_XAUDIO2 )
int _tmain( int /*argc*/, _TCHAR* /*argv[]*/ )
#else // RAKI_USING_XAUDIO2
int main( int /*argc*/, char * /*argv[]*/ )
#endif // RAKI_USING_XAUDIO2
{
#if defined ( RAKI_PLATFORM_WII )
DVDInit();
VIInit();
raki::SystemAllocator_Initialize();
#elif defined ( RAKI_PLATFORM_WIN32 )
raki::CoInitializeInitObject coInitializeInitObject;
#elif defined ( RAKI_PLATFORM_CAFE )
u32 gx2InitAttribs[] =
{
GX2_INIT_ATTRIB_NULL // terminates the list
};
GX2Init(gx2InitAttribs);
// launch test on Core 0 if present
if (OSGetCoreCount() == 3)
{
OSThread* defaultThread0;
SetupCoreIds();
OSReport("Running Core == %d\n", running_core);
OSReport("OS Main Core == %d\n\n", main_core);
OSInitRendezvous(&rendezvous);
//
// Restart default thread on 1st subcore, core0
//
defaultThread0 = OSGetDefaultThread(first_subcore);
OSRunThread(defaultThread0,
run_demo,
0,
(void*) 0x23232323);
OSWaitRendezvous(&rendezvous, wait_first_subcore);
}
else
{
run_demo(0, NULL);
}
GX2Shutdown();
return 0;
#endif
#if !defined ( RAKI_PLATFORM_CAFE )
raki::TestInitializer initializer;
raki::TestSourceStreaming_Sine();
return 0;
#endif // !defined ( RAKI_PLATFORM_CAFE )
}