[*] 垃圾一样的线程模型

This commit is contained in:
acgist
2024-05-12 22:08:13 +08:00
parent 90e32fa2e3
commit 8dfd8c0d35
9 changed files with 69 additions and 29 deletions

View File

@@ -243,9 +243,11 @@ nlohmann::json request(const std::string& signal, const std::string& body, uint6
delete promise; delete promise;
return nlohmann::json{}; return nlohmann::json{};
} else { } else {
OH_LOG_DEBUG(LOG_APP, "请求响应:%{public}lld", id);
acgist::promiseMap.erase(id); acgist::promiseMap.erase(id);
delete promise; 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 result = asyncExecute([room, roomId, password]() {
int code = room->enter(password); int code = room->enter(password);
if(code == acgist::SUCCESS_CODE) { if(code == acgist::SUCCESS_CODE) {
try { room->produceMedia();
room->produceMedia();
} catch(const std::exception& e) {
OH_LOG_ERROR(LOG_APP, "进入房间异常:%{public}s %{public}s", roomId.data(), e.what());
}
} else { } else {
acgist::roomMap.erase(roomId); acgist::roomMap.erase(roomId);
delete room; delete room;

View File

@@ -24,7 +24,7 @@
#define __TAOYAO_OPENGL__ true #define __TAOYAO_OPENGL__ true
// 本地音频采集 // 本地音频采集
#define __TAOYAO_AUDIO_LOCAL__ false #define __TAOYAO_AUDIO_LOCAL__ true
// 本地视频采集 // 本地视频采集
#define __TAOYAO_VIDEO_LOCAL__ true #define __TAOYAO_VIDEO_LOCAL__ true

View File

@@ -48,6 +48,9 @@ namespace acgist {
*/ */
class TaoyaoAudioTrackSource : public webrtc::AudioTrackSinkInterface, public webrtc::Notifier<webrtc::AudioSourceInterface> { class TaoyaoAudioTrackSource : public webrtc::AudioTrackSinkInterface, public webrtc::Notifier<webrtc::AudioSourceInterface> {
public:
std::vector<webrtc::AudioTrackSinkInterface*> vector;
public: public:
TaoyaoAudioTrackSource(); TaoyaoAudioTrackSource();
virtual ~TaoyaoAudioTrackSource(); virtual ~TaoyaoAudioTrackSource();
@@ -56,6 +59,8 @@ public:
virtual webrtc::MediaSourceInterface::SourceState state() const override; virtual webrtc::MediaSourceInterface::SourceState state() const override;
virtual bool remote() 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 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;
}; };

View File

@@ -47,11 +47,11 @@ bool acgist::MediaManager::newPeerConnectionFactory() {
this->peerConnectionFactory = webrtc::CreatePeerConnectionFactory( this->peerConnectionFactory = webrtc::CreatePeerConnectionFactory(
// 网络线程 // 网络线程
this->networkThread.get(), this->networkThread.get(),
// 工作线程:可以使用信令线程 // 工作线程
this->workerThread.get(), this->workerThread.get(),
// 信令线程 // 信令线程
this->signalingThread.get(), this->signalingThread.get(),
// 音频设备:为空自动创建 // 音频设备
nullptr, nullptr,
// 音频编码 // 音频编码
webrtc::CreateBuiltinAudioEncoderFactory(), webrtc::CreateBuiltinAudioEncoderFactory(),

View File

@@ -6,6 +6,8 @@
#include "hilog/log.h" #include "hilog/log.h"
static std::recursive_mutex roomMutex; 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) { acgist::Room::Room(const std::string& roomId, acgist::MediaManager* mediaManager) : roomId(roomId), mediaManager(mediaManager) {
this->device = new mediasoupclient::Device(); this->device = new mediasoupclient::Device();
@@ -121,6 +123,7 @@ int acgist::Room::produceMedia() {
if(this->videoProduce) { if(this->videoProduce) {
// this->produceVideo(); // this->produceVideo();
} }
return 0;
} }
int acgist::Room::createSendTransport() { int acgist::Room::createSendTransport() {

View File

@@ -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) { 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() { acgist::TaoyaoVideoTrackSource::TaoyaoVideoTrackSource() {

View File

@@ -1,11 +1,40 @@
import { taoyaoSignal } from "../taoyao/TaoyaoSignal"; 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"; 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 @Entry
@Component @Component
struct Index { struct Index {
aboutToAppear() {
const context = getContext(this) as common.UIAbilityContext;
reqPermissionsFromUser(permissions, context);
}
build() { build() {
Column() { Column() {
Column() { Column() {

View File

@@ -4,8 +4,6 @@
* @author acgist * @author acgist
*/ */
import fs from '@ohos.file.fs';
class Config { class Config {
// 终端名称 // 终端名称
@@ -41,13 +39,6 @@ class Setting {
const setting = new 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 { export {
setting setting
} }

View File

@@ -92,7 +92,7 @@ class TaoyaoSignal {
this.reconnect(); this.reconnect();
}); });
// 配置CA证书 // 配置CA证书
const caPath = getContext(this).filesDir + setting.caPath; const caPath = getContext(this).cacheDir + setting.caPath;
hilog.info(0x0000, "TaoyaoSignal", "配置证书:%{public}s", caPath); hilog.info(0x0000, "TaoyaoSignal", "配置证书:%{public}s", caPath);
const options: webSocket.WebSocketRequestOptions = { const options: webSocket.WebSocketRequestOptions = {
caPath: caPath caPath: caPath
@@ -293,19 +293,19 @@ class TaoyaoSignal {
let ret: number = 0; let ret: number = 0;
switch (signal) { switch (signal) {
case "room::close": case "room::close":
ret = taoyaoModule.roomClose(message); // ret = taoyaoModule.roomClose(message);
break; break;
case "room::enter": case "room::enter":
ret = taoyaoModule.roomEnter(message); // ret = taoyaoModule.roomEnter(message);
break; break;
case "room::expel": case "room::expel":
ret = taoyaoModule.roomExpel(message); // ret = taoyaoModule.roomExpel(message);
break; break;
case "room::invite": case "room::invite":
ret = taoyaoModule.roomInvite(message); ret = taoyaoModule.roomInvite(message);
break; break;
case "room::leave": case "room::leave":
ret = taoyaoModule.roomLeave(message); // ret = taoyaoModule.roomLeave(message);
break; break;
case "room::client::list": case "room::client::list":
// ret = taoyaoModule.roomClientList(message); // ret = taoyaoModule.roomClientList(message);
@@ -314,22 +314,22 @@ class TaoyaoSignal {
// ret = taoyaoModule.mediaConsume(message); // ret = taoyaoModule.mediaConsume(message);
break; break;
case "media::consumer::close": case "media::consumer::close":
ret = taoyaoModule.mediaConsumerClose(message); // ret = taoyaoModule.mediaConsumerClose(message);
break; break;
case "media::consumer::pause": case "media::consumer::pause":
ret = taoyaoModule.mediaConsumerPause(message); // ret = taoyaoModule.mediaConsumerPause(message);
break; break;
case "media::consumer::resume": case "media::consumer::resume":
ret = taoyaoModule.mediaConsumerResume(message); // ret = taoyaoModule.mediaConsumerResume(message);
break; break;
case "media::producer::close": case "media::producer::close":
ret = taoyaoModule.mediaProducerClose(message); // ret = taoyaoModule.mediaProducerClose(message);
break; break;
case "media::producer::pause": case "media::producer::pause":
ret = taoyaoModule.mediaProducerPause(message); // ret = taoyaoModule.mediaProducerPause(message);
break; break;
case "media::producer::resume": case "media::producer::resume":
ret = taoyaoModule.mediaProducerResume(message); // ret = taoyaoModule.mediaProducerResume(message);
break; break;
default: default:
ret = -1; ret = -1;