Hello @chunsiong.zoom !
I’ve used your repositories as samples to write code for sending and receiving raw audio/video frames to the meeting room, however, the only part that is not working is the audio-sending part.
I’ve written the ZoomSDKVirtualAudioMicEvent.h header file:
#pragma once
#include <unistd.h>
#include <iostream>
#include <cstdint>
#include "rawdata/rawdata_audio_helper_interface.h"
#include "zoom_sdk.h"
#include "zoom_sdk_raw_data_def.h"
using namespace std;
using namespace ZOOMSDK;
class ZoomSDKVirtualAudioMicEvent :
public IZoomSDKVirtualAudioMicEvent
{
private:
IZoomSDKAudioRawDataSender* pSender_;
protected:
/// \brief Callback for virtual audio mic to do some initialization.
/// \param pSender, You can send audio data based on this object, see \link IZoomSDKAudioRawDataSender \endlink.
virtual void onMicInitialize(IZoomSDKAudioRawDataSender* pSender);
/// \brief Callback for virtual audio mic can send raw data with 'pSender'.
virtual void onMicStartSend();
/// \brief Callback for virtual audio mic should stop send raw data.
virtual void onMicStopSend();
/// \brief Callback for virtual audio mic is uninitialized.
virtual void onMicUninitialized();
};
the ZoomSDKVirtualAudioMicEvent.cpp: (Which I copy-pasted from your code)
#include <unistd.h>
#include <iostream>
#include <cstdint>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include "rawdata/rawdata_audio_helper_interface.h"
#include "ZoomSDKVirtualAudioMicEvent.h"
#include "zoom_sdk_def.h"
#include <thread>
using namespace std;
using namespace ZOOM_SDK_NAMESPACE;
int audio_play_flag = -1;
void PlayAudioFileToVirtualMic(IZoomSDKAudioRawDataSender* audio_sender, string audio_source)
{
// execute in a thread.
while (audio_play_flag > 0 && audio_sender) {
// Check if the file exists
ifstream file(audio_source, ios::binary | ios::ate);
if (!file.is_open()) {
std::cout << "Error: File not found. Tried to open " << audio_source << std::endl;
return;
}
// Get the file size
int file_size = file.tellg();
// Read the file into a buffer
vector<char> buffer(file_size);
file.seekg(0, ios::beg);
file.read(buffer.data(), file_size);
// Send the audio data to the virtual camera
std::cout << "************ BEFORE SEND IS CALLED!";
SDKError err = audio_sender->send(buffer.data(), buffer.size(), 44100);
std::cout << "***************************************************************";
if (err != SDKERR_SUCCESS) {
std::cout << "Error: Failed to send audio data to virtual camera. Error code: " << err << std::endl;
return;
}
file.close();
audio_play_flag = -1;
}
}
/// \brief Callback for virtual audio mic to do some initialization.
/// \param pSender, You can send audio data based on this object, see \link IZoomSDKAudioRawDataSender \endlink.
void ZoomSDKVirtualAudioMicEvent::onMicInitialize(IZoomSDKAudioRawDataSender* pSender) {
//pSender->send();
pSender_ = pSender;
printf("OnMicInitialize\n");
}
/// \brief Callback for virtual audio mic can send raw data with 'pSender'.
void ZoomSDKVirtualAudioMicEvent::onMicStartSend() {
printf("onMicStartSend\n");
std::cout << "onStartSend" << std::endl;
if (pSender_ && audio_play_flag != 1) {
while (audio_play_flag > -1) {}
audio_play_flag = 1;
std::string audio_source_ = "pcm1644m.wav";
thread(PlayAudioFileToVirtualMic, pSender_, audio_source_).detach();
}
}
/// \brief Callback for virtual audio mic should stop send raw data.
void ZoomSDKVirtualAudioMicEvent::onMicStopSend() {
printf("onMicStopSend\n");
audio_play_flag = 0;
}
/// \brief Callback for virtual audio mic is uninitialized.
void ZoomSDKVirtualAudioMicEvent::onMicUninitialized() {
std::cout << "onUninitialized" << std::endl;
pSender_ = nullptr;
}
and in the main.cpp file Besides all initialization I wrote the following:
void startSendRawAudio()
{
ZoomSDKVirtualAudioMicEvent * send_audio_source = new ZoomSDKVirtualAudioMicEvent();
IZoomSDKAudioRawDataHelper * send_audio_helper = GetAudioRawdataHelper();
SDKError err = send_audio_helper->setExternalAudioSource(send_audio_source);
if (err != SDKERR_SUCCESS)
{
std::cerr << "Error occured start send raw audio" << std::endl;
return;
}
std::cout << "Success start send raw audio" << std::endl;
}
- this is just a single function which I invoke in onInMeeting() function; Everything works fine except the audio sending part. I wanna know what I am missing here.
When I join the boot to a meeting the audio is not sent and it is just so silent. (The bot is unmuted)
Would love if you help me to overcome this issue.
Big thanks to you <3