diff options
-rw-r--r-- | examples/alffplay.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/examples/alffplay.cpp b/examples/alffplay.cpp index f372983a..6eedcd76 100644 --- a/examples/alffplay.cpp +++ b/examples/alffplay.cpp @@ -50,6 +50,24 @@ typedef void* (AL_APIENTRY*LPALMAPBUFFERSOFT)(ALuint buffer, ALsizei offset, ALs typedef void (AL_APIENTRY*LPALUNMAPBUFFERSOFT)(ALuint buffer); typedef void (AL_APIENTRY*LPALFLUSHMAPPEDBUFFERSOFT)(ALuint buffer, ALsizei offset, ALsizei length); #endif + +#ifndef AL_SOFT_events +#define AL_SOFT_events 1 +#define AL_EVENT_CALLBACK_FUNCTION_SOFT 0x1220 +#define AL_EVENT_CALLBACK_USER_PARAM_SOFT 0x1221 +#define AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT 0x1222 +#define AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT 0x1223 +#define AL_EVENT_TYPE_ERROR_SOFT 0x1224 +#define AL_EVENT_TYPE_PERFORMANCE_SOFT 0x1225 +#define AL_EVENT_TYPE_DEPRECATED_SOFT 0x1226 +typedef void (AL_APIENTRY*ALEVENTPROCSOFT)(ALenum eventType, ALuint object, ALuint param, + ALsizei length, const ALchar *message, + void *userParam); +typedef void (AL_APIENTRY*LPALEVENTCONTROLSOFT)(ALsizei count, const ALenum *types, ALboolean enable); +typedef void (AL_APIENTRY*LPALEVENTCALLBACKSOFT)(ALEVENTPROCSOFT callback, void *userParam); +typedef void* (AL_APIENTRY*LPALGETPOINTERSOFT)(ALenum pname); +typedef void (AL_APIENTRY*LPALGETPOINTERVSOFT)(ALenum pname, void **values); +#endif } namespace { @@ -70,6 +88,9 @@ LPALBUFFERSTORAGESOFT alBufferStorageSOFT; LPALMAPBUFFERSOFT alMapBufferSOFT; LPALUNMAPBUFFERSOFT alUnmapBufferSOFT; +LPALEVENTCONTROLSOFT alEventControlSOFT; +LPALEVENTCALLBACKSOFT alEventCallbackSOFT; + const seconds AVNoSyncThreshold(10); const milliseconds VideoSyncThreshold(10); @@ -232,6 +253,10 @@ struct AudioState { av_freep(&mSamples); } + static void AL_APIENTRY EventCallback(ALenum eventType, ALuint object, ALuint param, + ALsizei length, const ALchar *message, + void *userParam); + nanoseconds getClockNoLock(); nanoseconds getClock() { @@ -653,11 +678,45 @@ bool AudioState::readAudio(uint8_t *samples, int length) } +void AL_APIENTRY AudioState::EventCallback(ALenum eventType, ALuint object, ALuint param, + ALsizei length, const ALchar *message, + void *userParam) +{ + AudioState *self = reinterpret_cast<AudioState*>(userParam); + + std::cout<< "---- AL Event on AudioState "<<self<<" ----\nEvent: "; + switch(eventType) + { + case AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT: std::cout<< "Buffer completed"; break; + case AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT: std::cout<< "Source state changed"; break; + case AL_EVENT_TYPE_ERROR_SOFT: std::cout<< "API error"; break; + case AL_EVENT_TYPE_PERFORMANCE_SOFT: std::cout<< "Performance"; break; + case AL_EVENT_TYPE_DEPRECATED_SOFT: std::cout<< "Deprecated"; break; + default: std::cout<< "0x"<<std::hex<<std::setw(4)<<std::setfill('0')<<eventType<< + std::dec<<std::setw(0)<<std::setfill(' '); break; + } + std::cout<< "\n" + "Object ID: "<<object<<'\n'<< + "Parameter: "<<param<<'\n'<< + "Message: "<<std::string(message, length)<<"\n----"<< + std::endl; +} + int AudioState::handler() { + const ALenum types[5] = { + AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT, + AL_EVENT_TYPE_ERROR_SOFT, AL_EVENT_TYPE_PERFORMANCE_SOFT, AL_EVENT_TYPE_DEPRECATED_SOFT + }; std::unique_lock<std::mutex> lock(mSrcMutex); ALenum fmt; + if(alEventControlSOFT) + { + alEventControlSOFT(5, types, AL_TRUE); + alEventCallbackSOFT(EventCallback, this); + } + /* Find a suitable format for OpenAL. */ mDstChanLayout = 0; if(mCodecCtx->sample_fmt == AV_SAMPLE_FMT_U8 || mCodecCtx->sample_fmt == AV_SAMPLE_FMT_U8P) @@ -887,6 +946,12 @@ int AudioState::handler() finish: av_freep(&samples); + if(alEventControlSOFT) + { + alEventControlSOFT(5, types, AL_FALSE); + alEventCallbackSOFT(nullptr, nullptr); + } + return 0; } @@ -1643,6 +1708,14 @@ int main(int argc, char *argv[]) alUnmapBufferSOFT = reinterpret_cast<LPALUNMAPBUFFERSOFT>( alGetProcAddress("alUnmapBufferSOFT")); } + if(alIsExtensionPresent("AL_SOFTX_events")) + { + std::cout<< "Found AL_SOFT_events" <<std::endl; + alEventControlSOFT = reinterpret_cast<LPALEVENTCONTROLSOFT>( + alGetProcAddress("alEventControlSOFT")); + alEventCallbackSOFT = reinterpret_cast<LPALEVENTCALLBACKSOFT>( + alGetProcAddress("alEventCallbackSOFT")); + } if(fileidx < argc && strcmp(argv[fileidx], "-direct") == 0) { |