[*] 垃圾一样的线程模型
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user