mirror of
https://github.com/xlmnxp/blue-recorder.git
synced 2025-04-02 07:44:54 +03:00
add ffmpeg values
This commit is contained in:
parent
d49f73deff
commit
ff0e7e9113
62
Cargo.lock
generated
62
Cargo.lock
generated
@ -71,6 +71,21 @@ dependencies = [
|
|||||||
"pkg-config",
|
"pkg-config",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "android-tzdata"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "android_system_properties"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.94"
|
version = "1.0.94"
|
||||||
@ -468,6 +483,7 @@ dependencies = [
|
|||||||
"anyhow",
|
"anyhow",
|
||||||
"async-std",
|
"async-std",
|
||||||
"blue-recorder-core",
|
"blue-recorder-core",
|
||||||
|
"chrono",
|
||||||
"cpal",
|
"cpal",
|
||||||
"dark-light",
|
"dark-light",
|
||||||
"dirs",
|
"dirs",
|
||||||
@ -607,6 +623,20 @@ version = "0.2.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chrono"
|
||||||
|
version = "0.4.39"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
|
||||||
|
dependencies = [
|
||||||
|
"android-tzdata",
|
||||||
|
"iana-time-zone",
|
||||||
|
"js-sys",
|
||||||
|
"num-traits",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clang-sys"
|
name = "clang-sys"
|
||||||
version = "1.8.1"
|
version = "1.8.1"
|
||||||
@ -2006,6 +2036,29 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iana-time-zone"
|
||||||
|
version = "0.1.61"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
|
||||||
|
dependencies = [
|
||||||
|
"android_system_properties",
|
||||||
|
"core-foundation-sys 0.8.7",
|
||||||
|
"iana-time-zone-haiku",
|
||||||
|
"js-sys",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"windows-core 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iana-time-zone-haiku"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_collections"
|
name = "icu_collections"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
@ -4448,6 +4501,15 @@ dependencies = [
|
|||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-core"
|
||||||
|
version = "0.52.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-core"
|
name = "windows-core"
|
||||||
version = "0.54.0"
|
version = "0.54.0"
|
||||||
|
@ -7,6 +7,7 @@ edition = "2021"
|
|||||||
anyhow = "1.0.86"
|
anyhow = "1.0.86"
|
||||||
async-std = {version = "1.12.0", features = ["attributes"]}
|
async-std = {version = "1.12.0", features = ["attributes"]}
|
||||||
blue-recorder-core = { path = "../core" }
|
blue-recorder-core = { path = "../core" }
|
||||||
|
chrono = "0.4.19"
|
||||||
cpal = "0.15.3"
|
cpal = "0.15.3"
|
||||||
dark-light = "1.0.0"
|
dark-light = "1.0.0"
|
||||||
dirs = "4.0.0"
|
dirs = "4.0.0"
|
||||||
@ -21,5 +22,5 @@ secfmt = "0.1.1"
|
|||||||
# Windows-only dependency
|
# Windows-only dependency
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
display-info = "0.5.1"
|
display-info = "0.5.1"
|
||||||
x-win = "2.0.2"
|
|
||||||
winapi = { version = "0.3", features = ["winuser"] }
|
winapi = { version = "0.3", features = ["winuser"] }
|
||||||
|
x-win = "2.0.2"
|
||||||
|
@ -27,6 +27,11 @@ pub struct AreaCapture {
|
|||||||
pub height: u16,
|
pub height: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Title {
|
||||||
|
pub title: String,
|
||||||
|
}
|
||||||
|
|
||||||
impl AreaCapture {
|
impl AreaCapture {
|
||||||
pub fn new() -> Result<AreaCapture> {
|
pub fn new() -> Result<AreaCapture> {
|
||||||
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
||||||
@ -78,12 +83,6 @@ impl AreaCapture {
|
|||||||
Ok(*self)
|
Ok(*self)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
pub fn get_title(&mut self) -> Result<String> {
|
|
||||||
let title = get_active_window()?.title;
|
|
||||||
Ok(title)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
||||||
pub fn get_window_by_name(&mut self, name: &str) -> Result<Self> {
|
pub fn get_window_by_name(&mut self, name: &str) -> Result<Self> {
|
||||||
let coordinate = xwininfo_to_coordinate(
|
let coordinate = xwininfo_to_coordinate(
|
||||||
@ -121,6 +120,21 @@ impl AreaCapture {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
impl Title {
|
||||||
|
pub fn new() -> Result<Title> {
|
||||||
|
let title = Title {
|
||||||
|
title: String::new(),
|
||||||
|
};
|
||||||
|
Ok(title)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_title(&mut self) -> Result<Self> {
|
||||||
|
self.title = get_active_window()?.title;
|
||||||
|
Ok(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
||||||
fn xwininfo_to_coordinate(xwininfo_output: String) -> Result<(u16, u16, u16, u16)> {
|
fn xwininfo_to_coordinate(xwininfo_output: String) -> Result<(u16, u16, u16, u16)> {
|
||||||
let x: u16 = Regex::new(r"A.*X:\s+(\d+)\n")?
|
let x: u16 = Regex::new(r"A.*X:\s+(\d+)\n")?
|
||||||
|
163
gui/src/ui.rs
163
gui/src/ui.rs
@ -1,9 +1,10 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::Result;
|
||||||
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
||||||
use blue_recorder_core::ffmpeg_linux::Ffmpeg;
|
use blue_recorder_core::ffmpeg_linux::Ffmpeg;
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
use blue_recorder_core::ffmpeg_windows::Ffmpeg;
|
use blue_recorder_core::ffmpeg_windows::Ffmpeg;
|
||||||
use blue_recorder_core::utils::is_wayland;
|
use blue_recorder_core::utils::{is_wayland, RecordMode};
|
||||||
|
use chrono::Utc;
|
||||||
use cpal::traits::{DeviceTrait, HostTrait};
|
use cpal::traits::{DeviceTrait, HostTrait};
|
||||||
use libadwaita::{Application, Window};
|
use libadwaita::{Application, Window};
|
||||||
use libadwaita::gio::File;
|
use libadwaita::gio::File;
|
||||||
@ -12,7 +13,7 @@ use libadwaita::gtk::{AboutDialog, Builder, Button, CheckButton, ComboBoxText, C
|
|||||||
use libadwaita::prelude::*;
|
use libadwaita::prelude::*;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::ops::Add;
|
use std::ops::Add;
|
||||||
use std::path::Path;
|
use std::path::{Path, PathBuf};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use crate::{area_capture, config_management, fluent::get_bundle};
|
use crate::{area_capture, config_management, fluent::get_bundle};
|
||||||
@ -556,6 +557,9 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
// Buttons
|
// Buttons
|
||||||
let area_capture: Rc<RefCell<area_capture::AreaCapture>> =
|
let area_capture: Rc<RefCell<area_capture::AreaCapture>> =
|
||||||
Rc::new(RefCell::new(area_capture::AreaCapture::new()?));
|
Rc::new(RefCell::new(area_capture::AreaCapture::new()?));
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
let window_title: Rc<RefCell<area_capture::Title>> =
|
||||||
|
Rc::new(RefCell::new(area_capture::Title::new()?));
|
||||||
|
|
||||||
area_grab_label.set_label(&get_bundle("select-area", None));
|
area_grab_label.set_label(&get_bundle("select-area", None));
|
||||||
let _area_chooser_window = area_chooser_window.clone();
|
let _area_chooser_window = area_chooser_window.clone();
|
||||||
@ -638,6 +642,8 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
let _error_message = error_message.clone();
|
let _error_message = error_message.clone();
|
||||||
window_grab_button.set_tooltip_text(Some(&get_bundle("window-tooltip", None)));
|
window_grab_button.set_tooltip_text(Some(&get_bundle("window-tooltip", None)));
|
||||||
window_grab_label.set_label(&get_bundle("select-window", None));
|
window_grab_label.set_label(&get_bundle("select-window", None));
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
let mut _window_title: Rc<RefCell<area_capture::Title>> = window_title.clone();
|
||||||
window_grab_button.connect_clicked(move |_| {
|
window_grab_button.connect_clicked(move |_| {
|
||||||
let text_buffer = TextBuffer::new(None);
|
let text_buffer = TextBuffer::new(None);
|
||||||
config_management::set_bool("default", "areacheck", _area_switch.is_active());
|
config_management::set_bool("default", "areacheck", _area_switch.is_active());
|
||||||
@ -657,12 +663,13 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
let error_message = _error_message.clone();
|
let error_message = _error_message.clone();
|
||||||
let error_dialog = error_dialog.clone();
|
let error_dialog = error_dialog.clone();
|
||||||
let _select_window = select_window.clone();
|
let _select_window = select_window.clone();
|
||||||
|
let window_title = _window_title.clone();
|
||||||
glib::timeout_add_local(1000, move || {
|
glib::timeout_add_local(1000, move || {
|
||||||
let clicked = area_capture::check_input();
|
let clicked = area_capture::check_input();
|
||||||
if clicked {
|
if clicked {
|
||||||
_select_window.hide();
|
_select_window.hide();
|
||||||
if area_capture.borrow_mut().get_title().is_err() {
|
if window_title.borrow_mut().get_title().is_err() {
|
||||||
text_buffer.set_text("Failed to get window info.");
|
text_buffer.set_text("Failed to get window title.");
|
||||||
error_message.set_buffer(Some(&text_buffer));
|
error_message.set_buffer(Some(&text_buffer));
|
||||||
error_dialog.show();
|
error_dialog.show();
|
||||||
}
|
}
|
||||||
@ -686,21 +693,84 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Record struct values
|
// Record struct values
|
||||||
let audio_input_id = audio_source_combobox
|
let audio_input_id = audio_source_combobox.active_id().unwrap().to_string();
|
||||||
.active_id()
|
|
||||||
.ok_or_else(|| anyhow!("Failed to get audio_input_id value from audio_source_combobox."))?;
|
|
||||||
let audio_output_id = output_device;
|
let audio_output_id = output_device;
|
||||||
let filename = String::from("");
|
let audio_record_bitrate = audio_bitrate_spin.value() as u16;
|
||||||
let output_file = Path::new(&filename)
|
#[derive(Debug, Clone)]
|
||||||
.extension()
|
struct FileName {
|
||||||
.ok_or_else(|| anyhow!("Failed to get output extension from filename."))?;
|
filename: (FileChooserNative, Entry, ComboBoxText),
|
||||||
|
}
|
||||||
|
let struct_filename = FileName {
|
||||||
|
filename: (
|
||||||
|
folder_chooser_native,
|
||||||
|
filename_entry,
|
||||||
|
format_chooser_combobox,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
let filename = struct_filename
|
||||||
|
.filename
|
||||||
|
.0
|
||||||
|
.file()
|
||||||
|
.unwrap()
|
||||||
|
.path()
|
||||||
|
.unwrap()
|
||||||
|
.join(PathBuf::from(format!(
|
||||||
|
"{}.{}",
|
||||||
|
if struct_filename.filename.1.text().to_string().trim().eq("") {
|
||||||
|
Utc::now().to_string().replace(" UTC", "").replace(' ', "-")
|
||||||
|
} else {
|
||||||
|
struct_filename.filename.1.text().to_string().trim().to_string()
|
||||||
|
},
|
||||||
|
struct_filename.filename.2.active_id().unwrap()
|
||||||
|
)))
|
||||||
|
.as_path()
|
||||||
|
.display().to_string();
|
||||||
|
let follow_mouse = follow_mouse_switch.is_active();
|
||||||
|
let mode = if area_grab_button.is_active() {
|
||||||
|
RecordMode::Area
|
||||||
|
} else if window_grab_button.is_active() {
|
||||||
|
RecordMode::Window
|
||||||
|
} else {
|
||||||
|
RecordMode::Screen
|
||||||
|
};
|
||||||
|
let output = Path::new(&filename).extension().unwrap().to_string_lossy().to_string();
|
||||||
|
let record_delay = delay_spin.value() as u16;
|
||||||
|
let record_frames = frames_spin.value() as u16;
|
||||||
|
let record_mouse = mouse_switch.is_active();
|
||||||
|
let show_area = area_switch.is_active();
|
||||||
|
let video_record_bitrate = video_bitrate_spin.value() as u16;
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
let window_title = window_title.borrow_mut().title.clone();
|
||||||
|
|
||||||
// Init record struct
|
// Init record struct
|
||||||
/*let ffmpeg_record_interface: Rc<RefCell<Ffmpeg>> = Rc::new(RefCell::new(Ffmpeg {
|
#[cfg(target_os = "windows")]
|
||||||
audio_input_id: String::new(),
|
let ffmpeg_record_interface: Rc<RefCell<Ffmpeg>> = Rc::new(RefCell::new(Ffmpeg {
|
||||||
audio_output_id: String::new(),
|
audio_input_id,
|
||||||
filename: String::from("/home/chibani/test_record.mp4"),
|
audio_output_id,
|
||||||
output: String::from("mp4"),
|
filename,
|
||||||
|
output,
|
||||||
|
temp_input_audio_filename: String::new(),
|
||||||
|
temp_output_audio_filename: String::new(),
|
||||||
|
temp_video_filename: String::new(),
|
||||||
|
window_title,
|
||||||
|
height: None,
|
||||||
|
input_audio_process: None,
|
||||||
|
output_audio_process: None,
|
||||||
|
video_process: None,
|
||||||
|
audio_record_bitrate,
|
||||||
|
record_delay,
|
||||||
|
record_frames,
|
||||||
|
video_record_bitrate,
|
||||||
|
follow_mouse,
|
||||||
|
record_mouse,
|
||||||
|
show_area,
|
||||||
|
}));
|
||||||
|
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
|
||||||
|
let ffmpeg_record_interface: Rc<RefCell<Ffmpeg>> = Rc::new(RefCell::new(Ffmpeg {
|
||||||
|
audio_input_id,
|
||||||
|
audio_output_id,
|
||||||
|
filename,
|
||||||
|
output,
|
||||||
temp_input_audio_filename: String::new(),
|
temp_input_audio_filename: String::new(),
|
||||||
temp_output_audio_filename: String::new(),
|
temp_output_audio_filename: String::new(),
|
||||||
temp_video_filename: String::new(),
|
temp_video_filename: String::new(),
|
||||||
@ -708,45 +778,14 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
input_audio_process: None,
|
input_audio_process: None,
|
||||||
output_audio_process: None,
|
output_audio_process: None,
|
||||||
video_process: None,
|
video_process: None,
|
||||||
audio_record_bitrate: 0,
|
audio_record_bitrate,
|
||||||
record_delay: 0,
|
record_delay,
|
||||||
record_frames: 10,
|
record_frames,
|
||||||
video_record_bitrate: 0,
|
video_record_bitrate,
|
||||||
follow_mouse: false,
|
follow_mouse,
|
||||||
record_mouse: true,
|
record_mouse,
|
||||||
show_area: false,
|
show_area,
|
||||||
}*/
|
}));
|
||||||
/*let ffmpeg_record_interface: Rc<RefCell<Ffmpeg>> = Rc::new(RefCell::new(Ffmpeg {
|
|
||||||
filename: (
|
|
||||||
folder_chooser_native,
|
|
||||||
filename_entry,
|
|
||||||
format_chooser_combobox,
|
|
||||||
),
|
|
||||||
record_video: video_switch,
|
|
||||||
record_audio: audio_input_switch,
|
|
||||||
audio_id: audio_source_combobox,
|
|
||||||
record_mouse: mouse_switch,
|
|
||||||
follow_mouse: follow_mouse_switch,
|
|
||||||
record_frames: frames_spin,
|
|
||||||
command: command_entry,
|
|
||||||
video_process: None,
|
|
||||||
audio_process: None,
|
|
||||||
saved_filename: None,
|
|
||||||
height: None,
|
|
||||||
unbound: None,
|
|
||||||
window: main_window.clone(),
|
|
||||||
record_delay: delay_spin,
|
|
||||||
record_wayland: wayland_record,
|
|
||||||
record_window,
|
|
||||||
main_context,
|
|
||||||
temp_video_filename: String::new(),
|
|
||||||
bundle: bundle_msg,
|
|
||||||
video_record_bitrate: video_bitrate_spin,
|
|
||||||
audio_record_bitrate: audio_bitrate_spin,
|
|
||||||
error_window: error_dialog,
|
|
||||||
error_window_text: error_dialog_label,
|
|
||||||
error_details: error_message,
|
|
||||||
}));*/
|
|
||||||
|
|
||||||
// Record button
|
// Record button
|
||||||
//let bundle_msg = get_bundle("already-exist", None);
|
//let bundle_msg = get_bundle("already-exist", None);
|
||||||
@ -755,7 +794,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
delay_window_title.set_label(&get_bundle("delay-title", None));
|
delay_window_title.set_label(&get_bundle("delay-title", None));
|
||||||
let _delay_window = delay_window.clone();
|
let _delay_window = delay_window.clone();
|
||||||
let _delay_window_button = delay_window_button.clone();
|
let _delay_window_button = delay_window_button.clone();
|
||||||
//let _ffmpeg_record_interface = ffmpeg_record_interface.clone();
|
let _ffmpeg_record_interface = ffmpeg_record_interface.clone();
|
||||||
//let main_context = glib::MainContext::default();
|
//let main_context = glib::MainContext::default();
|
||||||
let _main_window = main_window.clone();
|
let _main_window = main_window.clone();
|
||||||
let _play_button = play_button.clone();
|
let _play_button = play_button.clone();
|
||||||
@ -777,13 +816,15 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
_record_button.clone(),
|
_record_button.clone(),
|
||||||
);
|
);
|
||||||
} else if _delay_spin.value() as u64 == 0 {
|
} else if _delay_spin.value() as u64 == 0 {
|
||||||
/*let _area_capture = area_capture.borrow_mut();
|
let _area_capture = area_capture.borrow_mut();
|
||||||
match _ffmpeg_record_interface.borrow_mut().start_record(
|
let start_video_record = _ffmpeg_record_interface.borrow_mut().start_video(
|
||||||
_area_capture.x,
|
_area_capture.x,
|
||||||
_area_capture.y,
|
_area_capture.y,
|
||||||
_area_capture.width,
|
_area_capture.width,
|
||||||
_area_capture.height,
|
_area_capture.height,
|
||||||
) {
|
mode,
|
||||||
|
);
|
||||||
|
/*match start_video_record {
|
||||||
None => {
|
None => {
|
||||||
// Do nothing if the start_record function return nothing
|
// Do nothing if the start_record function return nothing
|
||||||
}
|
}
|
||||||
@ -802,7 +843,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Stop record button
|
// Stop record button
|
||||||
//let mut _ffmpeg_record_interface = ffmpeg_record_interface.clone();
|
let mut _ffmpeg_record_interface = ffmpeg_record_interface.clone();
|
||||||
let _play_button = play_button.clone();
|
let _play_button = play_button.clone();
|
||||||
let _stop_button = stop_button.clone();
|
let _stop_button = stop_button.clone();
|
||||||
stop_button.set_tooltip_text(Some(&get_bundle("stop-tooltip", None)));
|
stop_button.set_tooltip_text(Some(&get_bundle("stop-tooltip", None)));
|
||||||
|
Loading…
Reference in New Issue
Block a user