mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-06-11 04:33:08 +08:00
Revert "Revert "revert linux use cpal "" (#10326)
* Revert "Revert "revert linux use cpal (#10260)" (#10262)"
This reverts commit 827b5f6a4c
.
* update Cargo.lock
Signed-off-by: 21pages <sunboeasy@gmail.com>
---------
Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
parent
25e438a663
commit
bc461fe99b
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -5466,7 +5466,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "rust-pulsectl"
|
name = "rust-pulsectl"
|
||||||
version = "0.2.12"
|
version = "0.2.12"
|
||||||
source = "git+https://github.com/open-trade/pulsectl#5e68f4c2b7c644fa321984688602d71e8ad0bba3"
|
source = "git+https://github.com/rustdesk-org/pulsectl#aa34dde499aa912a3abc5289cc0b547bd07dd6e2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libpulse-binding",
|
"libpulse-binding",
|
||||||
]
|
]
|
||||||
@ -5813,7 +5813,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "sciter-rs"
|
name = "sciter-rs"
|
||||||
version = "0.5.57"
|
version = "0.5.57"
|
||||||
source = "git+https://github.com/open-trade/rust-sciter?branch=dyn#5322f3a755a0e6bf999fbc60d1efc35246c0f821"
|
source = "git+https://github.com/rustdesk-org/rust-sciter?branch=dyn#5322f3a755a0e6bf999fbc60d1efc35246c0f821"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"libc",
|
"libc",
|
||||||
|
@ -78,6 +78,9 @@ fon = "0.6"
|
|||||||
zip = "0.6"
|
zip = "0.6"
|
||||||
shutdown_hooks = "0.1"
|
shutdown_hooks = "0.1"
|
||||||
totp-rs = { version = "5.4", default-features = false, features = ["gen_secret", "otpauth"] }
|
totp-rs = { version = "5.4", default-features = false, features = ["gen_secret", "otpauth"] }
|
||||||
|
|
||||||
|
[target.'cfg(not(target_os = "linux"))'.dependencies]
|
||||||
|
# https://github.com/rustdesk/rustdesk/discussions/10197, not use cpal on linux
|
||||||
cpal = { git = "https://github.com/rustdesk-org/cpal", branch = "osx-screencapturekit" }
|
cpal = { git = "https://github.com/rustdesk-org/cpal", branch = "osx-screencapturekit" }
|
||||||
ringbuf = "0.3"
|
ringbuf = "0.3"
|
||||||
|
|
||||||
|
@ -2,12 +2,14 @@ use async_trait::async_trait;
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
use clipboard_master::{CallbackResult, ClipboardHandler};
|
use clipboard_master::{CallbackResult, ClipboardHandler};
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
use cpal::{
|
use cpal::{
|
||||||
traits::{DeviceTrait, HostTrait, StreamTrait},
|
traits::{DeviceTrait, HostTrait, StreamTrait},
|
||||||
Device, Host, StreamConfig,
|
Device, Host, StreamConfig,
|
||||||
};
|
};
|
||||||
use crossbeam_queue::ArrayQueue;
|
use crossbeam_queue::ArrayQueue;
|
||||||
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
use ringbuf::{ring_buffer::RbBase, Rb};
|
use ringbuf::{ring_buffer::RbBase, Rb};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
@ -117,6 +119,7 @@ pub const SCRAP_OTHER_VERSION_OR_X11_REQUIRED: &str =
|
|||||||
pub const SCRAP_X11_REQUIRED: &str = "x11 expected";
|
pub const SCRAP_X11_REQUIRED: &str = "x11 expected";
|
||||||
pub const SCRAP_X11_REF_URL: &str = "https://rustdesk.com/docs/en/manual/linux/#x11-required";
|
pub const SCRAP_X11_REF_URL: &str = "https://rustdesk.com/docs/en/manual/linux/#x11-required";
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
pub const AUDIO_BUFFER_MS: usize = 3000;
|
pub const AUDIO_BUFFER_MS: usize = 3000;
|
||||||
|
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
@ -139,6 +142,7 @@ struct TextClipboardState {
|
|||||||
running: bool,
|
running: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
static ref AUDIO_HOST: Host = cpal::default_host();
|
static ref AUDIO_HOST: Host = cpal::default_host();
|
||||||
}
|
}
|
||||||
@ -861,20 +865,28 @@ impl ClipboardHandler for ClientClipboardHandler {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct AudioHandler {
|
pub struct AudioHandler {
|
||||||
audio_decoder: Option<(AudioDecoder, Vec<f32>)>,
|
audio_decoder: Option<(AudioDecoder, Vec<f32>)>,
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
simple: Option<psimple::Simple>,
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
audio_buffer: AudioBuffer,
|
audio_buffer: AudioBuffer,
|
||||||
sample_rate: (u32, u32),
|
sample_rate: (u32, u32),
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
audio_stream: Option<Box<dyn StreamTrait>>,
|
audio_stream: Option<Box<dyn StreamTrait>>,
|
||||||
channels: u16,
|
channels: u16,
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
device_channel: u16,
|
device_channel: u16,
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
ready: Arc<std::sync::Mutex<bool>>,
|
ready: Arc<std::sync::Mutex<bool>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
struct AudioBuffer(
|
struct AudioBuffer(
|
||||||
pub Arc<std::sync::Mutex<ringbuf::HeapRb<f32>>>,
|
pub Arc<std::sync::Mutex<ringbuf::HeapRb<f32>>>,
|
||||||
usize,
|
usize,
|
||||||
[usize; 30],
|
[usize; 30],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
impl Default for AudioBuffer {
|
impl Default for AudioBuffer {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self(
|
Self(
|
||||||
@ -887,6 +899,7 @@ impl Default for AudioBuffer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
impl AudioBuffer {
|
impl AudioBuffer {
|
||||||
pub fn resize(&mut self, sample_rate: usize, channels: usize) {
|
pub fn resize(&mut self, sample_rate: usize, channels: usize) {
|
||||||
let capacity = sample_rate * channels * AUDIO_BUFFER_MS / 1000;
|
let capacity = sample_rate * channels * AUDIO_BUFFER_MS / 1000;
|
||||||
@ -989,7 +1002,37 @@ impl AudioBuffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AudioHandler {
|
impl AudioHandler {
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
fn start_audio(&mut self, format0: AudioFormat) -> ResultType<()> {
|
||||||
|
use psimple::Simple;
|
||||||
|
use pulse::sample::{Format, Spec};
|
||||||
|
use pulse::stream::Direction;
|
||||||
|
|
||||||
|
let spec = Spec {
|
||||||
|
format: Format::F32le,
|
||||||
|
channels: format0.channels as _,
|
||||||
|
rate: format0.sample_rate as _,
|
||||||
|
};
|
||||||
|
if !spec.is_valid() {
|
||||||
|
bail!("Invalid audio format");
|
||||||
|
}
|
||||||
|
|
||||||
|
self.simple = Some(Simple::new(
|
||||||
|
None, // Use the default server
|
||||||
|
&crate::get_app_name(), // Our application’s name
|
||||||
|
Direction::Playback, // We want a playback stream
|
||||||
|
None, // Use the default device
|
||||||
|
"playback", // Description of our stream
|
||||||
|
&spec, // Our sample format
|
||||||
|
None, // Use default channel map
|
||||||
|
None, // Use default buffering attributes
|
||||||
|
)?);
|
||||||
|
self.sample_rate = (format0.sample_rate, format0.sample_rate);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Start the audio playback.
|
/// Start the audio playback.
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
fn start_audio(&mut self, format0: AudioFormat) -> ResultType<()> {
|
fn start_audio(&mut self, format0: AudioFormat) -> ResultType<()> {
|
||||||
let device = AUDIO_HOST
|
let device = AUDIO_HOST
|
||||||
.default_output_device()
|
.default_output_device()
|
||||||
@ -1057,13 +1100,20 @@ impl AudioHandler {
|
|||||||
/// Handle audio frame and play it.
|
/// Handle audio frame and play it.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn handle_frame(&mut self, frame: AudioFrame) {
|
pub fn handle_frame(&mut self, frame: AudioFrame) {
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
if self.audio_stream.is_none() || !self.ready.lock().unwrap().clone() {
|
if self.audio_stream.is_none() || !self.ready.lock().unwrap().clone() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
if self.simple.is_none() {
|
||||||
|
log::debug!("PulseAudio simple binding does not exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
self.audio_decoder.as_mut().map(|(d, buffer)| {
|
self.audio_decoder.as_mut().map(|(d, buffer)| {
|
||||||
if let Ok(n) = d.decode_float(&frame.data, buffer, false) {
|
if let Ok(n) = d.decode_float(&frame.data, buffer, false) {
|
||||||
let channels = self.channels;
|
let channels = self.channels;
|
||||||
let n = n * (channels as usize);
|
let n = n * (channels as usize);
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
{
|
{
|
||||||
let sample_rate0 = self.sample_rate.0;
|
let sample_rate0 = self.sample_rate.0;
|
||||||
let sample_rate = self.sample_rate.1;
|
let sample_rate = self.sample_rate.1;
|
||||||
@ -1087,11 +1137,18 @@ impl AudioHandler {
|
|||||||
}
|
}
|
||||||
self.audio_buffer.append_pcm(&buffer);
|
self.audio_buffer.append_pcm(&buffer);
|
||||||
}
|
}
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
{
|
||||||
|
let data_u8 =
|
||||||
|
unsafe { std::slice::from_raw_parts::<u8>(buffer.as_ptr() as _, n * 4) };
|
||||||
|
self.simple.as_mut().map(|x| x.write(data_u8));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Build audio output stream for current device.
|
/// Build audio output stream for current device.
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
fn build_output_stream<T: cpal::Sample + cpal::SizedSample + cpal::FromSample<f32>>(
|
fn build_output_stream<T: cpal::Sample + cpal::SizedSample + cpal::FromSample<f32>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
config: &StreamConfig,
|
config: &StreamConfig,
|
||||||
|
Loading…
Reference in New Issue
Block a user