[*] 垃圾一样的线程模型
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#define __TAOYAO_OPENGL__ true
|
||||
|
||||
// 本地音频采集
|
||||
#define __TAOYAO_AUDIO_LOCAL__ false
|
||||
#define __TAOYAO_AUDIO_LOCAL__ true
|
||||
// 本地视频采集
|
||||
#define __TAOYAO_VIDEO_LOCAL__ true
|
||||
|
||||
|
||||
@@ -48,6 +48,9 @@ namespace acgist {
|
||||
*/
|
||||
class TaoyaoAudioTrackSource : public webrtc::AudioTrackSinkInterface, public webrtc::Notifier<webrtc::AudioSourceInterface> {
|
||||
|
||||
public:
|
||||
std::vector<webrtc::AudioTrackSinkInterface*> 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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -47,11 +47,11 @@ bool acgist::MediaManager::newPeerConnectionFactory() {
|
||||
this->peerConnectionFactory = webrtc::CreatePeerConnectionFactory(
|
||||
// 网络线程
|
||||
this->networkThread.get(),
|
||||
// 工作线程:可以使用信令线程
|
||||
// 工作线程
|
||||
this->workerThread.get(),
|
||||
// 信令线程
|
||||
this->signalingThread.get(),
|
||||
// 音频设备:为空自动创建
|
||||
// 音频设备
|
||||
nullptr,
|
||||
// 音频编码
|
||||
webrtc::CreateBuiltinAudioEncoderFactory(),
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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<Permissions> = [
|
||||
"ohos.permission.CAMERA",
|
||||
"ohos.permission.MICROPHONE",
|
||||
"ohos.permission.READ_MEDIA",
|
||||
"ohos.permission.WRITE_MEDIA",
|
||||
];
|
||||
|
||||
function reqPermissionsFromUser(permissions: Array<Permissions>, 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() {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user