even more Android code, still not working...
This commit is contained in:
parent
ee4fedc689
commit
3343ea0a77
2 changed files with 90 additions and 51 deletions
|
@ -63,29 +63,81 @@ CSound::CSound ( void (*fpNewProcessCallback) ( CVector<short>& psData, void* ar
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr );
|
nullptr );
|
||||||
|
|
||||||
|
// realize the output mix
|
||||||
(*outputMixObject)->Realize ( outputMixObject,
|
(*outputMixObject)->Realize ( outputMixObject,
|
||||||
SL_BOOLEAN_FALSE );
|
SL_BOOLEAN_FALSE );
|
||||||
|
|
||||||
// configure the output buffer queue.
|
// configure the audio (data) source for input
|
||||||
|
SLDataLocator_IODevice micLocator;
|
||||||
|
micLocator.locatorType = SL_DATALOCATOR_IODEVICE;
|
||||||
|
micLocator.deviceType = SL_IODEVICE_AUDIOINPUT;
|
||||||
|
micLocator.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
|
||||||
|
micLocator.device = nullptr;
|
||||||
|
|
||||||
|
SLDataSource inDataSource;
|
||||||
|
inDataSource.pLocator = &micLocator;
|
||||||
|
inDataSource.pFormat = nullptr;
|
||||||
|
|
||||||
|
// configure the input buffer queue
|
||||||
|
SLDataLocator_AndroidSimpleBufferQueue inBufferQueue;
|
||||||
|
inBufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
|
||||||
|
inBufferQueue.numBuffers = 1; // max number of buffers in queue
|
||||||
|
|
||||||
|
// configure the audio (data) sink for input
|
||||||
|
SLDataSink inDataSink;
|
||||||
|
inDataSink.pLocator = &inBufferQueue;
|
||||||
|
inDataSink.pFormat = &streamFormat;
|
||||||
|
|
||||||
|
// create the audio recorder
|
||||||
|
const SLInterfaceID recorderIds[] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
|
||||||
|
const SLboolean recorderReq[] = { SL_BOOLEAN_TRUE };
|
||||||
|
|
||||||
|
(*engine)->CreateAudioRecorder ( engine,
|
||||||
|
&recorderObject,
|
||||||
|
&inDataSource,
|
||||||
|
&inDataSink,
|
||||||
|
1,
|
||||||
|
recorderIds,
|
||||||
|
recorderReq );
|
||||||
|
|
||||||
|
// realize the audio recorder
|
||||||
|
(*recorderObject)->Realize ( recorderObject,
|
||||||
|
SL_BOOLEAN_FALSE );
|
||||||
|
|
||||||
|
// get the audio recorder interface
|
||||||
|
(*recorderObject)->GetInterface ( recorderObject,
|
||||||
|
SL_IID_RECORD,
|
||||||
|
&recorder );
|
||||||
|
|
||||||
|
// get the audio recorder simple buffer queue interface
|
||||||
|
(*recorderObject)->GetInterface ( recorderObject,
|
||||||
|
SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
|
||||||
|
&recorderSimpleBufQueue );
|
||||||
|
|
||||||
|
// register the audio input callback
|
||||||
|
(*recorderSimpleBufQueue)->RegisterCallback ( recorderSimpleBufQueue,
|
||||||
|
processInput,
|
||||||
|
this );
|
||||||
|
|
||||||
|
// configure the output buffer queue
|
||||||
SLDataLocator_AndroidSimpleBufferQueue outBufferQueue;
|
SLDataLocator_AndroidSimpleBufferQueue outBufferQueue;
|
||||||
outBufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
|
outBufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
|
||||||
outBufferQueue.numBuffers = 1; // max number of buffers in queue
|
outBufferQueue.numBuffers = 1; // max number of buffers in queue
|
||||||
|
|
||||||
// configure the audio (data) source
|
// configure the audio (data) source for output
|
||||||
SLDataSource dataSource;
|
SLDataSource outDataSource;
|
||||||
dataSource.pLocator = &outBufferQueue;
|
outDataSource.pLocator = &outBufferQueue;
|
||||||
dataSource.pFormat = &streamFormat;
|
outDataSource.pFormat = &streamFormat;
|
||||||
|
|
||||||
// configure the output mix
|
// configure the output mix
|
||||||
SLDataLocator_OutputMix outputMix;
|
SLDataLocator_OutputMix outputMix;
|
||||||
outputMix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
|
outputMix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
|
||||||
outputMix.outputMix = outputMixObject;
|
outputMix.outputMix = outputMixObject;
|
||||||
|
|
||||||
// configure the audio (data) sink
|
// configure the audio (data) sink for output
|
||||||
SLDataSink dataSink;
|
SLDataSink outDataSink;
|
||||||
dataSink.pLocator = &outputMix;
|
outDataSink.pLocator = &outputMix;
|
||||||
dataSink.pFormat = nullptr;
|
outDataSink.pFormat = nullptr;
|
||||||
|
|
||||||
// create the audio player
|
// create the audio player
|
||||||
const SLInterfaceID playerIds[] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
|
const SLInterfaceID playerIds[] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
|
||||||
|
@ -93,8 +145,8 @@ CSound::CSound ( void (*fpNewProcessCallback) ( CVector<short>& psData, void* ar
|
||||||
|
|
||||||
(*engine)->CreateAudioPlayer ( engine,
|
(*engine)->CreateAudioPlayer ( engine,
|
||||||
&playerObject,
|
&playerObject,
|
||||||
&dataSource,
|
&outDataSource,
|
||||||
&dataSink,
|
&outDataSink,
|
||||||
1,
|
1,
|
||||||
playerIds,
|
playerIds,
|
||||||
playerReq );
|
playerReq );
|
||||||
|
@ -122,6 +174,7 @@ CSound::CSound ( void (*fpNewProcessCallback) ( CVector<short>& psData, void* ar
|
||||||
void CSound::CloseOpenSL()
|
void CSound::CloseOpenSL()
|
||||||
{
|
{
|
||||||
// clean up
|
// clean up
|
||||||
|
(*recorderObject)->Destroy ( recorderObject );
|
||||||
(*playerObject)->Destroy ( playerObject );
|
(*playerObject)->Destroy ( playerObject );
|
||||||
(*outputMixObject)->Destroy ( outputMixObject );
|
(*outputMixObject)->Destroy ( outputMixObject );
|
||||||
(*engineObject)->Destroy ( engineObject );
|
(*engineObject)->Destroy ( engineObject );
|
||||||
|
@ -224,32 +277,21 @@ int iActualMonoBufferSize = iNewPrefMonoBufferSize;
|
||||||
return iOpenSLBufferSizeMono;
|
return iOpenSLBufferSizeMono;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void CSound::processInput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
||||||
OSStatus CSound::processInput ( void* inRefCon,
|
void* instance )
|
||||||
AudioUnitRenderActionFlags* ioActionFlags,
|
|
||||||
const AudioTimeStamp* inTimeStamp,
|
|
||||||
UInt32 inBusNumber,
|
|
||||||
UInt32 inNumberFrames,
|
|
||||||
AudioBufferList* )
|
|
||||||
{
|
{
|
||||||
CSound* pSound = reinterpret_cast<CSound*> ( inRefCon );
|
CSound* pSound = reinterpret_cast<CSound*> ( instance );
|
||||||
|
|
||||||
QMutexLocker locker ( &pSound->Mutex );
|
QMutexLocker locker ( &pSound->Mutex );
|
||||||
|
|
||||||
// get the new audio data
|
// enqueue the buffer for record
|
||||||
AudioUnitRender ( pSound->audioInputUnit,
|
(*bufferQueue)->Enqueue ( bufferQueue,
|
||||||
ioActionFlags,
|
&pSound->vecsTmpAudioSndCrdStereo[0],
|
||||||
inTimeStamp,
|
pSound->iOpenSLBufferSizeStero );
|
||||||
inBusNumber,
|
|
||||||
inNumberFrames,
|
|
||||||
pSound->pBufferList );
|
|
||||||
|
|
||||||
// call processing callback function
|
// call processing callback function
|
||||||
pSound->ProcessCallback ( pSound->vecsTmpAudioSndCrdStereo );
|
pSound->ProcessCallback ( pSound->vecsTmpAudioSndCrdStereo );
|
||||||
|
|
||||||
return noErr;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
void CSound::processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
void CSound::processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
||||||
void* instance )
|
void* instance )
|
||||||
|
@ -258,7 +300,7 @@ void CSound::processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
||||||
|
|
||||||
QMutexLocker locker ( &pSound->Mutex );
|
QMutexLocker locker ( &pSound->Mutex );
|
||||||
|
|
||||||
// enqueue the buffer for playback.
|
// enqueue the buffer for playback
|
||||||
(*bufferQueue)->Enqueue ( bufferQueue,
|
(*bufferQueue)->Enqueue ( bufferQueue,
|
||||||
&pSound->vecsTmpAudioSndCrdStereo[0],
|
&pSound->vecsTmpAudioSndCrdStereo[0],
|
||||||
pSound->iOpenSLBufferSizeStero );
|
pSound->iOpenSLBufferSizeStero );
|
||||||
|
|
|
@ -53,21 +53,18 @@ protected:
|
||||||
|
|
||||||
void CloseOpenSL();
|
void CloseOpenSL();
|
||||||
|
|
||||||
/*
|
|
||||||
// callbacks
|
// callbacks
|
||||||
static OSStatus processInput ( void* inRefCon,
|
static void processInput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
||||||
AudioUnitRenderActionFlags* ioActionFlags,
|
void* instance );
|
||||||
const AudioTimeStamp* inTimeStamp,
|
|
||||||
UInt32 inBusNumber,
|
|
||||||
UInt32 inNumberFrames,
|
|
||||||
AudioBufferList* );
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
static void processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
|
||||||
void* instance );
|
void* instance );
|
||||||
|
|
||||||
SLObjectItf engineObject;
|
SLObjectItf engineObject;
|
||||||
SLEngineItf engine;
|
SLEngineItf engine;
|
||||||
|
SLObjectItf recorderObject;
|
||||||
|
SLRecordItf recorder;
|
||||||
|
SLAndroidSimpleBufferQueueItf recorderSimpleBufQueue;
|
||||||
SLObjectItf outputMixObject;
|
SLObjectItf outputMixObject;
|
||||||
SLObjectItf playerObject;
|
SLObjectItf playerObject;
|
||||||
SLPlayItf player;
|
SLPlayItf player;
|
||||||
|
|
Loading…
Reference in a new issue