mirror of
https://github.com/csd4ni3l/soundboard.git
synced 2026-04-17 16:07:22 +02:00
Compare commits
2 Commits
0ae204ed0f
...
e7fbf8f4d8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7fbf8f4d8 | ||
|
|
815663b039 |
67
src/main.rs
67
src/main.rs
@@ -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.
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user