wip: connection
This commit is contained in:
parent
28ad271693
commit
1f40963b5d
@ -1543,7 +1543,6 @@ where
|
|||||||
F: 'static + FnMut(&[u8]) + Send,
|
F: 'static + FnMut(&[u8]) + Send,
|
||||||
{
|
{
|
||||||
let (video_sender, video_receiver) = mpsc::channel::<MediaData>();
|
let (video_sender, video_receiver) = mpsc::channel::<MediaData>();
|
||||||
let (audio_sender, audio_receiver) = mpsc::channel::<MediaData>();
|
|
||||||
let mut video_callback = video_callback;
|
let mut video_callback = video_callback;
|
||||||
|
|
||||||
let latency_controller = LatencyController::new();
|
let latency_controller = LatencyController::new();
|
||||||
@ -1573,8 +1572,19 @@ where
|
|||||||
}
|
}
|
||||||
log::info!("Video decoder loop exits");
|
log::info!("Video decoder loop exits");
|
||||||
});
|
});
|
||||||
|
let audio_sender = start_audio_thread(Some(latency_controller_cl));
|
||||||
|
return (video_sender, audio_sender);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Start an audio thread
|
||||||
|
/// Return a audio [`MediaSender`]
|
||||||
|
pub fn start_audio_thread(
|
||||||
|
latency_controller: Option<Arc<Mutex<LatencyController>>>,
|
||||||
|
) -> MediaSender {
|
||||||
|
let latency_controller = latency_controller.unwrap_or(LatencyController::new());
|
||||||
|
let (audio_sender, audio_receiver) = mpsc::channel::<MediaData>();
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
let mut audio_handler = AudioHandler::new(latency_controller_cl);
|
let mut audio_handler = AudioHandler::new(latency_controller);
|
||||||
loop {
|
loop {
|
||||||
if let Ok(data) = audio_receiver.recv() {
|
if let Ok(data) = audio_receiver.recv() {
|
||||||
match data {
|
match data {
|
||||||
@ -1592,7 +1602,7 @@ where
|
|||||||
}
|
}
|
||||||
log::info!("Audio decoder loop exits");
|
log::info!("Audio decoder loop exits");
|
||||||
});
|
});
|
||||||
return (video_sender, audio_sender);
|
audio_sender
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handle latency test.
|
/// Handle latency test.
|
||||||
|
@ -32,6 +32,7 @@ use hbb_common::tokio::{
|
|||||||
};
|
};
|
||||||
use hbb_common::{allow_err, message_proto::*, sleep};
|
use hbb_common::{allow_err, message_proto::*, sleep};
|
||||||
use hbb_common::{fs, log, Stream};
|
use hbb_common::{fs, log, Stream};
|
||||||
|
use std::borrow::Borrow;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
@ -89,6 +90,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
|
|
||||||
pub async fn io_loop(&mut self, key: &str, token: &str) {
|
pub async fn io_loop(&mut self, key: &str, token: &str) {
|
||||||
let stop_clipboard = self.start_clipboard();
|
let stop_clipboard = self.start_clipboard();
|
||||||
|
let stop_client_audio = self.start_client_audio();
|
||||||
let mut last_recv_time = Instant::now();
|
let mut last_recv_time = Instant::now();
|
||||||
let mut received = false;
|
let mut received = false;
|
||||||
let conn_type = if self.handler.is_file_transfer() {
|
let conn_type = if self.handler.is_file_transfer() {
|
||||||
@ -96,6 +98,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
} else {
|
} else {
|
||||||
ConnType::default()
|
ConnType::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
match Client::start(
|
match Client::start(
|
||||||
&self.handler.id,
|
&self.handler.id,
|
||||||
key,
|
key,
|
||||||
@ -224,6 +227,9 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
if let Some(stop) = stop_clipboard {
|
if let Some(stop) = stop_clipboard {
|
||||||
stop.send(()).ok();
|
stop.send(()).ok();
|
||||||
}
|
}
|
||||||
|
if let Some(stop) = stop_client_audio {
|
||||||
|
stop.send(()).ok();
|
||||||
|
}
|
||||||
SERVER_KEYBOARD_ENABLED.store(false, Ordering::SeqCst);
|
SERVER_KEYBOARD_ENABLED.store(false, Ordering::SeqCst);
|
||||||
SERVER_CLIPBOARD_ENABLED.store(false, Ordering::SeqCst);
|
SERVER_CLIPBOARD_ENABLED.store(false, Ordering::SeqCst);
|
||||||
SERVER_FILE_TRANSFER_ENABLED.store(false, Ordering::SeqCst);
|
SERVER_FILE_TRANSFER_ENABLED.store(false, Ordering::SeqCst);
|
||||||
@ -257,10 +263,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start a local audio recorder, records audio and send to remote
|
// Start a local audio recorder, records audio and send to remote
|
||||||
fn start_client_audio(
|
fn start_client_audio(&mut self) -> Option<std::sync::mpsc::Sender<()>> {
|
||||||
&mut self,
|
|
||||||
audio_sender: MediaSender,
|
|
||||||
) -> Option<std::sync::mpsc::Sender<()>> {
|
|
||||||
if self.handler.is_file_transfer() || self.handler.is_port_forward() {
|
if self.handler.is_file_transfer() || self.handler.is_port_forward() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
@ -268,29 +271,47 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
let (tx, rx) = std::sync::mpsc::channel();
|
let (tx, rx) = std::sync::mpsc::channel();
|
||||||
let (tx_audio_data, mut rx_audio_data) = hbb_common::tokio::sync::mpsc::unbounded_channel();
|
let (tx_audio_data, mut rx_audio_data) = hbb_common::tokio::sync::mpsc::unbounded_channel();
|
||||||
// Create a stand-alone inner, add subscribe to audio service
|
// Create a stand-alone inner, add subscribe to audio service
|
||||||
let client_conn_inner = ConnInner::new(
|
let conn_id = CLIENT_SERVER.write().unwrap().get_new_id();
|
||||||
CLIENT_SERVER.write().unwrap().get_new_id(),
|
let client_conn_inner = ConnInner::new(conn_id.clone(), Some(tx_audio_data), None);
|
||||||
Some(tx_audio_data),
|
// now we subscribe
|
||||||
None,
|
CLIENT_SERVER.write().unwrap().subscribe(
|
||||||
|
audio_service::NAME,
|
||||||
|
client_conn_inner.clone(),
|
||||||
|
true,
|
||||||
);
|
);
|
||||||
CLIENT_SERVER
|
let tx_audio = self.sender.clone();
|
||||||
.write()
|
|
||||||
.unwrap()
|
|
||||||
.subscribe(audio_service::NAME, client_conn_inner, true);
|
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
loop {
|
loop {
|
||||||
// check if client is closed
|
// check if client is closed
|
||||||
match rx.try_recv() {
|
match rx.try_recv() {
|
||||||
Ok(_) | Err(std::sync::mpsc::TryRecvError::Disconnected) => {
|
Ok(_) | Err(std::sync::mpsc::TryRecvError::Disconnected) => {
|
||||||
log::debug!("Exit local audio service of client");
|
log::debug!("Exit local audio service of client");
|
||||||
|
// unsubscribe
|
||||||
|
CLIENT_SERVER.write().unwrap().subscribe(
|
||||||
|
audio_service::NAME,
|
||||||
|
client_conn_inner,
|
||||||
|
false,
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
match rx_audio_data.try_recv() {
|
match rx_audio_data.try_recv() {
|
||||||
Ok((instant, msg)) => match msg.union {
|
Ok((instant, msg)) => match &msg.union {
|
||||||
Some(_) => todo!(),
|
Some(message::Union::AudioFrame(frame)) => {
|
||||||
None => todo!(),
|
let mut msg = Message::new();
|
||||||
|
msg.set_audio_frame(frame.clone());
|
||||||
|
tx_audio.send(Data::Message(msg)).ok();
|
||||||
|
log::debug!("send audio frame {}", frame.timestamp);
|
||||||
|
}
|
||||||
|
Some(message::Union::Misc(misc)) => {
|
||||||
|
let mut msg = Message::new();
|
||||||
|
msg.set_misc(misc.clone());
|
||||||
|
tx_audio.send(Data::Message(msg)).ok();
|
||||||
|
log::debug!("send audio misc {:?}", misc.audio_format());
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
None => {}
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
if err == TryRecvError::Empty {
|
if err == TryRecvError::Empty {
|
||||||
|
@ -1244,6 +1244,9 @@ pub fn main_current_is_wayland() -> SyncReturn<bool> {
|
|||||||
|
|
||||||
pub fn main_is_login_wayland() -> SyncReturn<bool> {
|
pub fn main_is_login_wayland() -> SyncReturn<bool> {
|
||||||
SyncReturn(is_login_wayland())
|
SyncReturn(is_login_wayland())
|
||||||
|
pub fn main_start_pa() {
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
std::thread::spawn(crate::ipc::start_pa);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_hide_docker() -> SyncReturn<bool> {
|
pub fn main_hide_docker() -> SyncReturn<bool> {
|
||||||
|
@ -1533,6 +1533,10 @@ impl Connection {
|
|||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
|
Some(misc::Union::AudioFormat(format)) => {
|
||||||
|
// TODO: implement audio format handler
|
||||||
|
println!("recv audio format");
|
||||||
|
}
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
Some(misc::Union::SwitchSidesRequest(s)) => {
|
Some(misc::Union::SwitchSidesRequest(s)) => {
|
||||||
if let Ok(uuid) = uuid::Uuid::from_slice(&s.uuid.to_vec()[..]) {
|
if let Ok(uuid) = uuid::Uuid::from_slice(&s.uuid.to_vec()[..]) {
|
||||||
@ -1550,6 +1554,10 @@ impl Connection {
|
|||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
|
Some(message::Union::AudioFrame(audio_frame)) => {
|
||||||
|
// TODO: implement audio frame handler
|
||||||
|
println!("recv audio frame");
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user