Skip to content

Commit

Permalink
feat(render): add audio rendering callback, return audio data that ha…
Browse files Browse the repository at this point in the history
…s processed
  • Loading branch information
kongjianneu authored and pingkai committed Jul 30, 2020
1 parent b25031a commit 6ba6696
Show file tree
Hide file tree
Showing 10 changed files with 74 additions and 15 deletions.
9 changes: 7 additions & 2 deletions framework/base/media/IAFPacket.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class CICADA_CPLUS_EXTERN IAFPacket {
virtual void setDiscard(bool discard)
{
mbDiscard = discard;
};
}

virtual bool getDiscard()
{
Expand Down Expand Up @@ -180,7 +180,12 @@ class CICADA_CPLUS_EXTERN IAFFrame {

virtual void setDiscard(bool discard)
{
mbDiscard = discard;
}

virtual bool getDiscard()
{
return mbDiscard;
}

AFFrameInfo &getInfo();
Expand All @@ -189,7 +194,7 @@ class CICADA_CPLUS_EXTERN IAFFrame {

protected:
AFFrameInfo mInfo{};

bool mbDiscard{false};
};


Expand Down
11 changes: 11 additions & 0 deletions framework/render/audio/IAudioRender.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
#include <utils/AFMediaType.h>

namespace Cicada{

typedef bool (*renderingFrameCB)(void *userData, IAFFrame *frame);

class IAFRenderFilter {
public:
virtual ~IAFRenderFilter() = default;
Expand Down Expand Up @@ -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};
};
}

Expand Down
21 changes: 16 additions & 5 deletions framework/render/audio/SdlAFAudioRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ namespace Cicada {

SdlAFAudioRender::~SdlAFAudioRender()
{
if (mDevID > 0) {
SDL_CloseAudioDevice(mDevID);
mDevID = 0;
}
SDL_QuitSubSystem(SDL_INIT_AUDIO);

if (pcmBuffer != nullptr) {
Expand Down Expand Up @@ -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<uint8_t *>(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) {
Expand All @@ -102,7 +105,11 @@ namespace Cicada {
bufferSize = pcmDataLength;
pcmBuffer = static_cast<uint8_t *>(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);
Expand All @@ -122,7 +129,11 @@ namespace Cicada {
bufferSize = pcmDataLength;
pcmBuffer = static_cast<uint8_t *>(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);
Expand Down
2 changes: 2 additions & 0 deletions mediaPlayer/ICicadaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ namespace Cicada {

virtual void SetOnRenderCallBack(onRenderFrame cb, void *userData) = 0;

virtual void SetAudioRenderingCallBack(onRenderFrame cb, void *userData) = 0;

/*
*设置显示窗口
*/
Expand Down
7 changes: 7 additions & 0 deletions mediaPlayer/MediaPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions mediaPlayer/MediaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ namespace Cicada {

void SetOnRenderFrameCallback(onRenderFrame cb, void *userData);

void SetAudioRenderingCallback(onRenderFrame cb, void *userData);

void SetStreamTypeFlags(uint64_t flags);


Expand Down
12 changes: 12 additions & 0 deletions mediaPlayer/SuperMediaPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2993,6 +2993,7 @@ int SuperMediaPlayer::setUpAudioRender(const IAFFrame::audioInfo &info)
{
if (mAudioRender == nullptr) {
mAudioRender = AudioRenderFactory::create();
mAudioRender->setRenderingCb(mAudioRenderingCb, mFrameCbUserData);
}

assert(mAudioRender);
Expand Down Expand Up @@ -3299,6 +3300,10 @@ void SuperMediaPlayer::Reset()

mSecretPlayBack = false;
mDrmKeyValid = false;
mAudioRenderingCb = nullptr;
mAudioRenderingCbUserData = nullptr;
mFrameCb = nullptr;
mFrameCbUserData = nullptr;
}

int SuperMediaPlayer::GetCurrentStreamIndex(StreamType type)
Expand Down Expand Up @@ -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);
Expand Down
15 changes: 7 additions & 8 deletions mediaPlayer/SuperMediaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -306,8 +308,7 @@ namespace Cicada {

class ApsaraAudioRenderCallback : public IAudioRenderListener {
public:
ApsaraAudioRenderCallback(SuperMediaPlayer &player)
: mPlayer(player)
ApsaraAudioRenderCallback(SuperMediaPlayer &player) : mPlayer(player)
{}

void onEOS() override
Expand Down Expand Up @@ -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
8 changes: 8 additions & 0 deletions mediaPlayer/media_player_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions mediaPlayer/media_player_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down

0 comments on commit 6ba6696

Please sign in to comment.