Compare commits

..

2 Commits

2 changed files with 50 additions and 43 deletions

View File

@@ -4,7 +4,7 @@ use std::{collections::HashMap, fs::File, io::BufReader, path::Path, time::Insta
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use bevy_egui::{EguiContextSettings, EguiContexts, EguiPrimaryContextPass, EguiStartupSet, egui::{self, Context}}; use bevy_egui::{EguiContextSettings, EguiContexts, EguiPrimaryContextPass, EguiStartupSet, egui::{self, Context, Ui}};
use egui::ecolor::Color32; use egui::ecolor::Color32;
@@ -269,7 +269,39 @@ fn play_sound(file_path: String, app_state: &mut AppState) {
app_state.currently_playing.push(playing_sound); app_state.currently_playing.push(playing_sound);
} }
fn main_ui(mut ctx: &Context, mut app_state: ResMut<AppState>) { fn create_virtual_mic_dropdown(ui: &mut Ui, app_state: &mut ResMut<AppState>, available_width: f32, available_height: f32) {
#[cfg(target_os = "linux")] {
let outputs = app_state.virt_outputs.clone();
let output_index = app_state.virt_output_index.clone();
let output_sink = linux_lib::get_sink_by_index("source-outputs", output_index);
if let Some(app_name) = output_sink["properties"]["application.name"].as_str() {
egui::ComboBox::from_id_salt("Virtual Mic Output")
.selected_text(app_name.to_string())
.width(available_width)
.height(available_height / 15.0)
.show_ui(ui, |ui| {
for output in &outputs {
ui.selectable_value(
&mut app_state.virt_output_index_switch,
output.1.clone(),
output.0.clone(),
);
}
});
}
else {
ui.add(egui::Button::new("No apps found to use.".to_string()));
}
return;
}
#[allow(unreachable_code)]
{
ui.add(egui::Button::new("Unsupported. Select inside apps.".to_string()));
}
}
fn main_ui(ctx: &Context, mut app_state: ResMut<AppState>) {
egui::SidePanel::right("tools").show(ctx, |ui| { egui::SidePanel::right("tools").show(ctx, |ui| {
ui.heading("Tools"); ui.heading("Tools");
@@ -277,33 +309,8 @@ fn main_ui(mut ctx: &Context, mut app_state: ResMut<AppState>) {
let available_width = ui.available_width(); let available_width = ui.available_width();
let available_height = ui.available_height(); let available_height = ui.available_height();
let outputs = app_state.virt_outputs.clone();
ui.label("Virtual Mic Output"); ui.label("Virtual Mic Output");
if cfg!(target_os = "linux") { create_virtual_mic_dropdown(ui, &mut app_state, available_width, available_height);
let output_index = app_state.virt_output_index.clone();
let output_sink = linux_lib::get_sink_by_index("source-outputs", output_index);
if let Some(app_name) = output_sink["properties"]["application.name"].as_str() {
egui::ComboBox::from_id_salt("Virtual Mic Output")
.selected_text(app_name.to_string())
.width(available_width)
.height(available_height / 15.0)
.show_ui(ui, |ui| {
for output in &outputs {
ui.selectable_value(
&mut app_state.virt_output_index_switch,
output.1.clone(),
output.0.clone(),
);
}
});
}
else {
ui.add(egui::Button::new("No apps found to use.".to_string()));
}
}
else {
ui.add(egui::Button::new("Unsupported. Select inside apps.".to_string()));
}
if ui if ui
.add_sized( .add_sized(
@@ -419,9 +426,9 @@ fn main_ui(mut ctx: &Context, mut app_state: ResMut<AppState>) {
}); });
} }
fn youtube_downloader_ui(mut ctx: &Context, mut app_state: ResMut<AppState>) { fn youtube_downloader_ui(ctx: &Context, app_state: ResMut<AppState>) {
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Coming Soon!"); ui.heading(format!("Coming Soon! Currently on {} view.", app_state.current_view)); // view is only included here so there is no warning about app_state not being used.
}); });
} }

View File

@@ -1,46 +1,46 @@
use rodio::{ use rodio::{
OutputStream, OutputStreamBuilder, OutputStream, OutputStreamBuilder,
cpal::{self, traits::DeviceTrait, traits::HostTrait}, cpal::{self, traits::{DeviceTrait, StreamTrait, HostTrait}, StreamConfig, SampleRate},
}; };
use ringbuf::{traits::*, HeapRb}; use ringbuf::{traits::*, HeapRb};
fn route_standard_to_virtual(virtual_mic: cpal::Device) { fn route_standard_to_virtual(host: &cpal::Host, virtual_mic: &cpal::Device) {
let standard_mic = host.default_output_device(); let standard_mic = host.default_input_device().expect("Could not get default input device.");
let config = StreamConfig { let config = StreamConfig {
channels: 2, channels: 2,
sample_rate: SampleRate(48_000), sample_rate: SampleRate(48_000),
buffer_size: cpal::BufferSize::Default, buffer_size: cpal::BufferSize::Default,
}; };
let rb = HeapRb::<i32>::new(48_000 * 2); let rb = HeapRb::<f32>::new(48_000 * 2);
let (mut producer, mut consumer) = rb.split(); let (mut producer, mut consumer) = rb.split();
let input_stream = standard_mic.build_input_stream( let input_stream = standard_mic.build_input_stream(
&config, &config,
move |data: &[f32], _| { move |data: &[f32], _| {
for &sample in data { for &sample in data {
let _ = producer.push(sample); let _ = producer.try_push(sample);
let _ = producer.push(sample); let _ = producer.try_push(sample);
} }
}, },
move |err| eprintln!("Input stream error: {err}"), move |err| eprintln!("Input stream error: {err}"),
None, None,
)?; ).expect("Could not build input stream for standard to virtual mic routing");
let output_stream = virtual_mic.build_output_stream( let output_stream = virtual_mic.build_output_stream(
&config, &config,
move |data: &mut [f32], _| { move |data: &mut [f32], _| {
for sample in data { for sample in data {
*sample = consumer.pop().unwrap_or(0.0); *sample = consumer.try_pop().unwrap_or(0.0);
} }
}, },
move |err| eprintln!("Output stream error: {err}"), move |err| eprintln!("Output stream error: {err}"),
None, None,
)?; ).expect("Could not build output stream for standard to virtual mic routing");
input_stream.play()?; input_stream.play();
output_stream.play()?; output_stream.play();
} }
pub fn create_virtual_mic_windows() -> (OutputStream, OutputStream) { pub fn create_virtual_mic_windows() -> (OutputStream, OutputStream) {
@@ -59,7 +59,7 @@ pub fn create_virtual_mic_windows() -> (OutputStream, OutputStream) {
}) })
.expect("Could not get VB Cable output device. Is VB Cable Driver installed?"); .expect("Could not get VB Cable output device. Is VB Cable Driver installed?");
route_standard_to_virtual(virtual_mic); route_standard_to_virtual(&host, &virtual_mic);
let normal_output = host let normal_output = host
.default_output_device() .default_output_device()
@@ -75,4 +75,4 @@ pub fn create_virtual_mic_windows() -> (OutputStream, OutputStream) {
.open_stream() .open_stream()
.expect("Failed to open stream"), .expect("Failed to open stream"),
); );
} }