Commit 85659741 authored by Rafaël Carré's avatar Rafaël Carré

opensles: Add macros to reduce khronos API verbosity

parent 984533a2
...@@ -42,6 +42,17 @@ ...@@ -42,6 +42,17 @@
// Maximum number of buffers to enqueue. // Maximum number of buffers to enqueue.
#define BUFF_QUEUE 42 #define BUFF_QUEUE 42
#define Destroy(a) (*a)->Destroy(a);
#define SetPlayState(a, b) (*a)->SetPlayState(a, b)
#define RegisterCallback(a, b, c) (*a)->RegisterCallback(a, b, c)
#define GetInterface(a, b, c) (*a)->GetInterface(a, b, c)
#define Realize(a, b) (*a)->Realize(a, b)
#define CreateOutputMix(a, b, c, d, e) (*a)->CreateOutputMix(a, b, c, d, e)
#define CreateAudioPlayer(a, b, c, d, e, f, g) \
(*a)->CreateAudioPlayer(a, b, c, d, e, f, g)
#define Enqueue(a, b, c) (*a)->Enqueue(a, b, c)
#define Clear(a) (*a)->Clear(a)
/***************************************************************************** /*****************************************************************************
* aout_sys_t: audio output method descriptor * aout_sys_t: audio output method descriptor
***************************************************************************** *****************************************************************************
...@@ -106,15 +117,9 @@ vlc_module_end () ...@@ -106,15 +117,9 @@ vlc_module_end ()
static void Clean( aout_sys_t *p_sys ) static void Clean( aout_sys_t *p_sys )
{ {
// Destroy buffer queue audio player object Destroy( p_sys->playerObject );
// and invalidate all associated interfaces Destroy( p_sys->outputMixObject );
(*p_sys->playerObject)->Destroy( p_sys->playerObject ); Destroy( p_sys->engineObject );
// destroy output mix object, and invalidate all associated interfaces
(*p_sys->outputMixObject)->Destroy( p_sys->outputMixObject );
// destroy engine object, and invalidate all associated interfaces
(*p_sys->engineObject)->Destroy( p_sys->engineObject );
dlclose( p_sys->p_so_handle ); dlclose( p_sys->p_so_handle );
...@@ -131,8 +136,7 @@ static void Play( audio_output_t *p_aout, block_t *p_buffer ) ...@@ -131,8 +136,7 @@ static void Play( audio_output_t *p_aout, block_t *p_buffer )
for (;;) for (;;)
{ {
SLresult result = (*p_sys->playerBufferQueue)->Enqueue( SLresult result = Enqueue( p_sys->playerBufferQueue, p_buffer->p_buffer,
p_sys->playerBufferQueue, p_buffer->p_buffer,
p_buffer->i_buffer ); p_buffer->i_buffer );
switch (result) switch (result)
...@@ -213,25 +217,21 @@ static int Open( vlc_object_t *p_this ) ...@@ -213,25 +217,21 @@ static int Open( vlc_object_t *p_this )
CHECK_OPENSL_ERROR( result, "Failed to create engine" ); CHECK_OPENSL_ERROR( result, "Failed to create engine" );
// realize the engine in synchronous mode // realize the engine in synchronous mode
result = (*p_sys->engineObject)->Realize( p_sys->engineObject, result = Realize( p_sys->engineObject, SL_BOOLEAN_FALSE );
SL_BOOLEAN_FALSE );
CHECK_OPENSL_ERROR( result, "Failed to realize engine" ); CHECK_OPENSL_ERROR( result, "Failed to realize engine" );
// get the engine interface, needed to create other objects // get the engine interface, needed to create other objects
result = (*p_sys->engineObject)->GetInterface( p_sys->engineObject, result = GetInterface( p_sys->engineObject, *SL_IID_ENGINE, &engineEngine );
*SL_IID_ENGINE, &engineEngine );
CHECK_OPENSL_ERROR( result, "Failed to get the engine interface" ); CHECK_OPENSL_ERROR( result, "Failed to get the engine interface" );
// create output mix, with environmental reverb specified as a non-required interface // create output mix, with environmental reverb specified as a non-required interface
const SLInterfaceID ids1[] = { *SL_IID_VOLUME }; const SLInterfaceID ids1[] = { *SL_IID_VOLUME };
const SLboolean req1[] = { SL_BOOLEAN_FALSE }; const SLboolean req1[] = { SL_BOOLEAN_FALSE };
result = (*engineEngine)->CreateOutputMix( engineEngine, result = CreateOutputMix( engineEngine, &p_sys->outputMixObject, 1, ids1, req1 );
&p_sys->outputMixObject, 1, ids1, req1 );
CHECK_OPENSL_ERROR( result, "Failed to create output mix" ); CHECK_OPENSL_ERROR( result, "Failed to create output mix" );
// realize the output mix in synchronous mode // realize the output mix in synchronous mode
result = (*p_sys->outputMixObject)->Realize( p_sys->outputMixObject, result = Realize( p_sys->outputMixObject, SL_BOOLEAN_FALSE );
SL_BOOLEAN_FALSE );
CHECK_OPENSL_ERROR( result, "Failed to realize output mix" ); CHECK_OPENSL_ERROR( result, "Failed to realize output mix" );
...@@ -261,38 +261,29 @@ static int Open( vlc_object_t *p_this ) ...@@ -261,38 +261,29 @@ static int Open( vlc_object_t *p_this )
//create audio player //create audio player
const SLInterfaceID ids2[] = { *SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; const SLInterfaceID ids2[] = { *SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
const SLboolean req2[] = { SL_BOOLEAN_TRUE }; static const SLboolean req2[] = { SL_BOOLEAN_TRUE };
result = (*engineEngine)->CreateAudioPlayer( engineEngine, result = CreateAudioPlayer( engineEngine, &p_sys->playerObject, &audioSrc,
&p_sys->playerObject, &audioSrc,
&audioSnk, sizeof( ids2 ) / sizeof( *ids2 ), &audioSnk, sizeof( ids2 ) / sizeof( *ids2 ),
ids2, req2 ); ids2, req2 );
CHECK_OPENSL_ERROR( result, "Failed to create audio player" ); CHECK_OPENSL_ERROR( result, "Failed to create audio player" );
// realize the player result = Realize( p_sys->playerObject, SL_BOOLEAN_FALSE );
result = (*p_sys->playerObject)->Realize( p_sys->playerObject,
SL_BOOLEAN_FALSE );
CHECK_OPENSL_ERROR( result, "Failed to realize player object." ); CHECK_OPENSL_ERROR( result, "Failed to realize player object." );
// get the play interface result = GetInterface( p_sys->playerObject, *SL_IID_PLAY, &p_sys->playerPlay );
result = (*p_sys->playerObject)->GetInterface( p_sys->playerObject,
*SL_IID_PLAY, &p_sys->playerPlay );
CHECK_OPENSL_ERROR( result, "Failed to get player interface." ); CHECK_OPENSL_ERROR( result, "Failed to get player interface." );
// get the buffer queue interface result = GetInterface( p_sys->playerObject, *SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
result = (*p_sys->playerObject)->GetInterface( p_sys->playerObject,
*SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
&p_sys->playerBufferQueue ); &p_sys->playerBufferQueue );
CHECK_OPENSL_ERROR( result, "Failed to get buff queue interface" ); CHECK_OPENSL_ERROR( result, "Failed to get buff queue interface" );
result = (*p_sys->playerBufferQueue)->RegisterCallback( p_sys->playerBufferQueue, result = RegisterCallback( p_sys->playerBufferQueue, PlayedCallback,
PlayedCallback, (void*)p_sys);
(void*)p_sys);
CHECK_OPENSL_ERROR( result, "Failed to register buff queue callback." ); CHECK_OPENSL_ERROR( result, "Failed to register buff queue callback." );
// set the player's state to playing // set the player's state to playing
result = (*p_sys->playerPlay)->SetPlayState( p_sys->playerPlay, result = SetPlayState( p_sys->playerPlay, SL_PLAYSTATE_PLAYING );
SL_PLAYSTATE_PLAYING );
CHECK_OPENSL_ERROR( result, "Failed to switch to playing state" ); CHECK_OPENSL_ERROR( result, "Failed to switch to playing state" );
// we want 16bit signed data little endian. // we want 16bit signed data little endian.
...@@ -318,9 +309,8 @@ static void Close( vlc_object_t *p_this ) ...@@ -318,9 +309,8 @@ static void Close( vlc_object_t *p_this )
audio_output_t *p_aout = (audio_output_t*)p_this; audio_output_t *p_aout = (audio_output_t*)p_this;
aout_sys_t *p_sys = p_aout->sys; aout_sys_t *p_sys = p_aout->sys;
(*p_sys->playerPlay)->SetPlayState( p_sys->playerPlay, SL_PLAYSTATE_STOPPED ); SetPlayState( p_sys->playerPlay, SL_PLAYSTATE_STOPPED );
//Flush remaining buffers if any. //Flush remaining buffers if any.
(*p_sys->playerBufferQueue)->Clear( p_sys->playerBufferQueue ); Clear( p_sys->playerBufferQueue );
Clean( p_sys ); Clean( p_sys );
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment