diff --git a/framework/base/media/IAFPacket.h b/framework/base/media/IAFPacket.h index 3b3f1cfe9..1bbbaa306 100644 --- a/framework/base/media/IAFPacket.h +++ b/framework/base/media/IAFPacket.h @@ -68,7 +68,7 @@ class CICADA_CPLUS_EXTERN IAFPacket { virtual void setDiscard(bool discard) { mbDiscard = discard; - }; + } virtual bool getDiscard() { @@ -180,7 +180,12 @@ class CICADA_CPLUS_EXTERN IAFFrame { virtual void setDiscard(bool discard) { + mbDiscard = discard; + } + virtual bool getDiscard() + { + return mbDiscard; } AFFrameInfo &getInfo(); @@ -189,7 +194,7 @@ class CICADA_CPLUS_EXTERN IAFFrame { protected: AFFrameInfo mInfo{}; - + bool mbDiscard{false}; }; diff --git a/framework/render/audio/IAudioRender.h b/framework/render/audio/IAudioRender.h index 9fa6a5dbb..884b007e4 100644 --- a/framework/render/audio/IAudioRender.h +++ b/framework/render/audio/IAudioRender.h @@ -10,6 +10,9 @@ #include namespace Cicada{ + + typedef bool (*renderingFrameCB)(void *userData, IAFFrame *frame); + class IAFRenderFilter { public: virtual ~IAFRenderFilter() = default; @@ -164,9 +167,17 @@ namespace Cicada{ mListener = listener; } + virtual void setRenderingCb(renderingFrameCB cb, void *userData) + { + mRenderingCb = cb; + mRenderingCbUserData = userData; + } + protected: IAudioRender *mExtFilter{}; IAudioRenderListener *mListener{}; + renderingFrameCB mRenderingCb{nullptr}; + void *mRenderingCbUserData{nullptr}; }; } diff --git a/framework/render/audio/SdlAFAudioRender.cpp b/framework/render/audio/SdlAFAudioRender.cpp index a56238410..433f79d70 100644 --- a/framework/render/audio/SdlAFAudioRender.cpp +++ b/framework/render/audio/SdlAFAudioRender.cpp @@ -16,6 +16,10 @@ namespace Cicada { SdlAFAudioRender::~SdlAFAudioRender() { + if (mDevID > 0) { + SDL_CloseAudioDevice(mDevID); + mDevID = 0; + } SDL_QuitSubSystem(SDL_INIT_AUDIO); if (pcmBuffer != nullptr) { @@ -71,12 +75,11 @@ namespace Cicada { bufferSize = getPCMDataLen(frame->getInfo().audio.channels, (enum AVSampleFormat) frame->getInfo().audio.format, frame->getInfo().audio.nb_samples); pcmBuffer = static_cast(malloc(bufferSize)); - if (SDL_OpenAudio(&mSpec, nullptr) < 0) { + mDevID = SDL_OpenAudioDevice(NULL, false, &mSpec, nullptr, SDL_AUDIO_ALLOW_ANY_CHANGE); + if (mDevID == 0) { AF_LOGE("SdlAFAudioRender could not openAudio! Error: %s\n", SDL_GetError()); return -1; } - - mDevID = 1; SDL_PauseAudioDevice(mDevID, 0); // start play audio } if (frame->getInfo().duration < 0 && frame->getInfo().audio.sample_rate > 0) { @@ -102,7 +105,11 @@ namespace Cicada { bufferSize = pcmDataLength; pcmBuffer = static_cast(realloc(pcmBuffer, bufferSize)); } - if (!mMute) { + bool rendered = false; + if (mRenderingCb) { + rendered = mRenderingCb(mRenderingCbUserData, filter_frame.get()); + } + if (!mMute && !rendered) { copyPCMData(getAVFrame(filter_frame.get()), pcmBuffer); } else { memset(pcmBuffer, 0, pcmDataLength); @@ -122,7 +129,11 @@ namespace Cicada { bufferSize = pcmDataLength; pcmBuffer = static_cast(realloc(pcmBuffer, bufferSize)); } - if (!mMute) { + bool rendered = false; + if (mRenderingCb) { + rendered = mRenderingCb(mRenderingCbUserData, frame.get()); + } + if (!mMute && !rendered) { copyPCMData(getAVFrame(frame.get()), pcmBuffer); } else { memset(pcmBuffer, 0, pcmDataLength); diff --git a/mediaPlayer/ICicadaPlayer.h b/mediaPlayer/ICicadaPlayer.h index 000e129e3..6fb970c4e 100644 --- a/mediaPlayer/ICicadaPlayer.h +++ b/mediaPlayer/ICicadaPlayer.h @@ -30,6 +30,8 @@ namespace Cicada { virtual void SetOnRenderCallBack(onRenderFrame cb, void *userData) = 0; + virtual void SetAudioRenderingCallBack(onRenderFrame cb, void *userData) = 0; + /* *设置显示窗口 */ diff --git a/mediaPlayer/MediaPlayer.cpp b/mediaPlayer/MediaPlayer.cpp index 3a26cd82b..8c23bc35e 100644 --- a/mediaPlayer/MediaPlayer.cpp +++ b/mediaPlayer/MediaPlayer.cpp @@ -1120,6 +1120,13 @@ namespace Cicada { GET_PLAYER_HANDLE; CicadaSetOnRenderCallBack(handle, cb, userData); } + + void MediaPlayer::SetAudioRenderingCallback(onRenderFrame cb, void *userData) + { + GET_PLAYER_HANDLE; + CicadaSetAudioRenderingCallBack(handle, cb, userData); + } + void MediaPlayer::SetStreamTypeFlags(uint64_t flags) { GET_PLAYER_HANDLE; diff --git a/mediaPlayer/MediaPlayer.h b/mediaPlayer/MediaPlayer.h index 695970c76..6dbb6d8b2 100644 --- a/mediaPlayer/MediaPlayer.h +++ b/mediaPlayer/MediaPlayer.h @@ -64,6 +64,8 @@ namespace Cicada { void SetOnRenderFrameCallback(onRenderFrame cb, void *userData); + void SetAudioRenderingCallback(onRenderFrame cb, void *userData); + void SetStreamTypeFlags(uint64_t flags); diff --git a/mediaPlayer/SuperMediaPlayer.cpp b/mediaPlayer/SuperMediaPlayer.cpp index 845f12b9c..4c7362e19 100644 --- a/mediaPlayer/SuperMediaPlayer.cpp +++ b/mediaPlayer/SuperMediaPlayer.cpp @@ -2993,6 +2993,7 @@ int SuperMediaPlayer::setUpAudioRender(const IAFFrame::audioInfo &info) { if (mAudioRender == nullptr) { mAudioRender = AudioRenderFactory::create(); + mAudioRender->setRenderingCb(mAudioRenderingCb, mFrameCbUserData); } assert(mAudioRender); @@ -3299,6 +3300,10 @@ void SuperMediaPlayer::Reset() mSecretPlayBack = false; mDrmKeyValid = false; + mAudioRenderingCb = nullptr; + mAudioRenderingCbUserData = nullptr; + mFrameCb = nullptr; + mFrameCbUserData = nullptr; } int SuperMediaPlayer::GetCurrentStreamIndex(StreamType type) @@ -4209,6 +4214,13 @@ void SuperMediaPlayer::SetOnRenderCallBack(onRenderFrame cb, void *userData) mFrameCb = cb; mFrameCbUserData = userData; } + +void SuperMediaPlayer::SetAudioRenderingCallBack(onRenderFrame cb, void *userData) +{ + mAudioRenderingCb = cb; + mAudioRenderingCbUserData = userData; +} + int SuperMediaPlayer::invokeComponent(std::string content) { return mDcaManager->invoke(content); diff --git a/mediaPlayer/SuperMediaPlayer.h b/mediaPlayer/SuperMediaPlayer.h index 39a44509d..f93fb163f 100644 --- a/mediaPlayer/SuperMediaPlayer.h +++ b/mediaPlayer/SuperMediaPlayer.h @@ -80,6 +80,8 @@ namespace Cicada { void SetOnRenderCallBack(onRenderFrame cb, void *userData) override; + void SetAudioRenderingCallBack(onRenderFrame cb, void *userData) override; + // TODO: use setParameters and setOpt to set void SetRefer(const char *refer) override; @@ -306,8 +308,7 @@ namespace Cicada { class ApsaraAudioRenderCallback : public IAudioRenderListener { public: - ApsaraAudioRenderCallback(SuperMediaPlayer &player) - : mPlayer(player) + ApsaraAudioRenderCallback(SuperMediaPlayer &player) : mPlayer(player) {} void onEOS() override @@ -535,12 +536,10 @@ namespace Cicada { onRenderFrame mFrameCb{nullptr}; void *mFrameCbUserData{nullptr}; + + onRenderFrame mAudioRenderingCb{nullptr}; + void *mAudioRenderingCbUserData{nullptr}; bool mIsDummy{false}; }; }// namespace Cicada -#endif // CICADA_PLAYER_SERVICE_H - - - - - +#endif// CICADA_PLAYER_SERVICE_H diff --git a/mediaPlayer/media_player_api.cpp b/mediaPlayer/media_player_api.cpp index e47c0f11a..5289209d6 100644 --- a/mediaPlayer/media_player_api.cpp +++ b/mediaPlayer/media_player_api.cpp @@ -56,6 +56,14 @@ void CicadaSetOnRenderCallBack(playerHandle *pHandle, onRenderFrame cb, void *us } } +void CicadaSetAudioRenderingCallBack(playerHandle *pHandle, onRenderFrame cb, void *userData) +{ + GET_PLAYER; + if (player) { + player->SetAudioRenderingCallBack(cb, userData); + } +} + void CicadaSetComponentCb(playerHandle *pHandle, player_component_type type, void *factory) { GET_PLAYER; diff --git a/mediaPlayer/media_player_api.h b/mediaPlayer/media_player_api.h index 347fc16b6..57187eee2 100644 --- a/mediaPlayer/media_player_api.h +++ b/mediaPlayer/media_player_api.h @@ -28,6 +28,8 @@ int CicadaSetListener(playerHandle *pHandle, const playerListener &Listener); void CicadaSetOnRenderCallBack(playerHandle *pHandle, onRenderFrame cb, void *userData); +void CicadaSetAudioRenderingCallBack(playerHandle *pHandle, onRenderFrame cb, void *userData); + /* * set external component callback */