Enable events in alffplay

This commit is contained in:
Chris Robinson 2018-01-24 20:04:57 -08:00
parent 0c9c846522
commit 932939c5a8

View File

@ -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)
{