diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp index b4e5c3d..e3b1cd3 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp @@ -243,9 +243,11 @@ nlohmann::json request(const std::string& signal, const std::string& body, uint6 delete promise; return nlohmann::json{}; } else { + OH_LOG_DEBUG(LOG_APP, "请求响应:%{public}lld", id); acgist::promiseMap.erase(id); delete promise; - return std::move(future.get()); + return future.get(); +// return std::move(future.get()); } } @@ -453,11 +455,7 @@ static napi_value roomInvite(napi_env env, napi_callback_info info) { int result = asyncExecute([room, roomId, password]() { int code = room->enter(password); if(code == acgist::SUCCESS_CODE) { - try { - room->produceMedia(); - } catch(const std::exception& e) { - OH_LOG_ERROR(LOG_APP, "进入房间异常:%{public}s %{public}s", roomId.data(), e.what()); - } + room->produceMedia(); } else { acgist::roomMap.erase(roomId); delete room; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp index 6b4c966..b918c28 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Capturer.hpp @@ -24,7 +24,7 @@ #define __TAOYAO_OPENGL__ true // 本地音频采集 -#define __TAOYAO_AUDIO_LOCAL__ false +#define __TAOYAO_AUDIO_LOCAL__ true // 本地视频采集 #define __TAOYAO_VIDEO_LOCAL__ true diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/WebRTC.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/WebRTC.hpp index 897d2dc..80f9a1f 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/WebRTC.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/WebRTC.hpp @@ -48,6 +48,9 @@ namespace acgist { */ class TaoyaoAudioTrackSource : public webrtc::AudioTrackSinkInterface, public webrtc::Notifier { +public: + std::vector vector; + public: TaoyaoAudioTrackSource(); virtual ~TaoyaoAudioTrackSource(); @@ -56,6 +59,8 @@ public: virtual webrtc::MediaSourceInterface::SourceState state() const override; virtual bool remote() const override; virtual void OnData(const void* audio_data, int bits_per_sample, int sample_rate, size_t number_of_channels, size_t number_of_frames) override; + virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) override; + virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override; }; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp index a56a0a3..1612d5a 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/MediaManager.cpp @@ -47,11 +47,11 @@ bool acgist::MediaManager::newPeerConnectionFactory() { this->peerConnectionFactory = webrtc::CreatePeerConnectionFactory( // 网络线程 this->networkThread.get(), - // 工作线程:可以使用信令线程 + // 工作线程 this->workerThread.get(), // 信令线程 this->signalingThread.get(), - // 音频设备:为空自动创建 + // 音频设备 nullptr, // 音频编码 webrtc::CreateBuiltinAudioEncoderFactory(), diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp index 951e584..a9dd8c4 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/Room.cpp @@ -6,6 +6,8 @@ #include "hilog/log.h" static std::recursive_mutex roomMutex; +static std::recursive_mutex mediaMutex; +static std::recursive_mutex clientMutex; acgist::Room::Room(const std::string& roomId, acgist::MediaManager* mediaManager) : roomId(roomId), mediaManager(mediaManager) { this->device = new mediasoupclient::Device(); @@ -121,6 +123,7 @@ int acgist::Room::produceMedia() { if(this->videoProduce) { // this->produceVideo(); } + return 0; } int acgist::Room::createSendTransport() { diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/WebRTC.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/WebRTC.cpp index 04fd057..bda26b5 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/WebRTC.cpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/WebRTC.cpp @@ -31,6 +31,20 @@ bool acgist::TaoyaoAudioTrackSource::remote() const { } void acgist::TaoyaoAudioTrackSource::OnData(const void* audio_data, int bits_per_sample, int sample_rate, size_t number_of_channels, size_t number_of_frames) { + OH_LOG_DEBUG(LOG_APP, "音频数据:%{public}d %{public}d %{public}d %{public}d", bits_per_sample, sample_rate, number_of_channels, number_of_frames); + for(auto iterator = this->vector.begin(); iterator != this->vector.end(); ++iterator) { + (*iterator)->OnData(audio_data, bits_per_sample, sample_rate, number_of_channels, number_of_frames); + } +} + +void acgist::TaoyaoAudioTrackSource::AddSink(webrtc::AudioTrackSinkInterface* sink) { + OH_LOG_DEBUG(LOG_APP, "添加本地音频管道"); +// this->vector.push_back(sink); +} + +void acgist::TaoyaoAudioTrackSource::RemoveSink(webrtc::AudioTrackSinkInterface* sink) { + OH_LOG_DEBUG(LOG_APP, "删除本地音频管道"); + // TODO: 删除 } acgist::TaoyaoVideoTrackSource::TaoyaoVideoTrackSource() { diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets index 086f9ce..073e1ee 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets @@ -1,11 +1,40 @@ import { taoyaoSignal } from "../taoyao/TaoyaoSignal"; +import fs from '@ohos.file.fs'; +import { BusinessError } from "@ohos.base"; +import common from "@ohos.app.ability.common"; +import abilityAccessCtrl, { Permissions } from "@ohos.abilityAccessCtrl"; + import { setting } from "../taoyao/Setting"; +const permissions: Array = [ + "ohos.permission.CAMERA", + "ohos.permission.MICROPHONE", + "ohos.permission.READ_MEDIA", + "ohos.permission.WRITE_MEDIA", +]; + +function reqPermissionsFromUser(permissions: Array, context: common.UIAbilityContext) { + abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context, permissions).then((data) => { + // 拷贝证书 + const caPath = context.filesDir + setting.caPath; + const caFile = fs.createRandomAccessFileSync(caPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); + const caText = context.resourceManager.getRawFileContentSync("cacert.pem").buffer; + caFile.writeSync(caText); + caFile.close(); + }).catch((err: BusinessError) => { + }); +} + @Entry @Component struct Index { + aboutToAppear() { + const context = getContext(this) as common.UIAbilityContext; + reqPermissionsFromUser(permissions, context); + } + build() { Column() { Column() { diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets index 1c36de8..2910149 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets @@ -4,8 +4,6 @@ * @author acgist */ -import fs from '@ohos.file.fs'; - class Config { // 终端名称 @@ -41,13 +39,6 @@ class Setting { const setting = new Setting(); -// 拷贝证书 -const caPath = getContext(this).filesDir + setting.caPath; -const caFile = fs.createRandomAccessFileSync(caPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); -const caText = getContext(this).resourceManager.getRawFileContentSync("cacert.pem").buffer; -caFile.writeSync(caText); -caFile.close(); - export { setting } diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets index fd6cb0f..ade9e1b 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets @@ -92,7 +92,7 @@ class TaoyaoSignal { this.reconnect(); }); // 配置CA证书 - const caPath = getContext(this).filesDir + setting.caPath; + const caPath = getContext(this).cacheDir + setting.caPath; hilog.info(0x0000, "TaoyaoSignal", "配置证书:%{public}s", caPath); const options: webSocket.WebSocketRequestOptions = { caPath: caPath @@ -293,19 +293,19 @@ class TaoyaoSignal { let ret: number = 0; switch (signal) { case "room::close": - ret = taoyaoModule.roomClose(message); + // ret = taoyaoModule.roomClose(message); break; case "room::enter": - ret = taoyaoModule.roomEnter(message); + // ret = taoyaoModule.roomEnter(message); break; case "room::expel": - ret = taoyaoModule.roomExpel(message); + // ret = taoyaoModule.roomExpel(message); break; case "room::invite": ret = taoyaoModule.roomInvite(message); break; case "room::leave": - ret = taoyaoModule.roomLeave(message); + // ret = taoyaoModule.roomLeave(message); break; case "room::client::list": // ret = taoyaoModule.roomClientList(message); @@ -314,22 +314,22 @@ class TaoyaoSignal { // ret = taoyaoModule.mediaConsume(message); break; case "media::consumer::close": - ret = taoyaoModule.mediaConsumerClose(message); + // ret = taoyaoModule.mediaConsumerClose(message); break; case "media::consumer::pause": - ret = taoyaoModule.mediaConsumerPause(message); + // ret = taoyaoModule.mediaConsumerPause(message); break; case "media::consumer::resume": - ret = taoyaoModule.mediaConsumerResume(message); + // ret = taoyaoModule.mediaConsumerResume(message); break; case "media::producer::close": - ret = taoyaoModule.mediaProducerClose(message); + // ret = taoyaoModule.mediaProducerClose(message); break; case "media::producer::pause": - ret = taoyaoModule.mediaProducerPause(message); + // ret = taoyaoModule.mediaProducerPause(message); break; case "media::producer::resume": - ret = taoyaoModule.mediaProducerResume(message); + // ret = taoyaoModule.mediaProducerResume(message); break; default: ret = -1;