audio: Volume scale partly working now

This commit is contained in:
Ian Douglas Scott 2022-07-22 13:26:36 -07:00
parent 4e95d4aead
commit 6160512abe
3 changed files with 41 additions and 17 deletions

View file

@ -12,6 +12,7 @@ use pa::PA;
mod task;
mod volume;
mod volume_scale;
use volume_scale::VolumeScale;
use futures::{channel::mpsc, stream::StreamExt};
use gtk4::{
@ -94,7 +95,7 @@ fn app(application: &Application) {
append: output_icon = &Image {
set_icon_name: Some("audio-speakers-symbolic"),
},
append: output_volume = &Scale::with_range(Orientation::Horizontal, 0., 100., 1.) {
append: output_volume = &VolumeScale::new(pa.clone(), true) {
set_format_value_func: |_, value| {
format!("{:.0}%", value)
},
@ -108,7 +109,7 @@ fn app(application: &Application) {
append: input_icon = &Image {
set_icon_name: Some("audio-input-microphone-symbolic"),
},
append: input_volume = &Scale::with_range(Orientation::Horizontal, 0., 100., 1.) {
append: input_volume = &VolumeScale::new(pa.clone(), false) {
set_format_value_func: |_, value| {
format!("{:.0}%", value)
},

View file

@ -1,8 +1,9 @@
use gtk4::{prelude::*, Scale};
use gtk4::prelude::*;
use libpulse_binding::volume::Volume;
use crate::pa::DeviceInfo;
use crate::{pa::DeviceInfo, volume_scale::VolumeScale};
pub fn update_volume(device: &DeviceInfo, scale: &Scale) {
scale.set_value((device.volume.avg().0 as f64 / Volume::NORMAL.0 as f64) * 100.);
pub fn update_volume(device: &DeviceInfo, scale: &VolumeScale) {
scale.set_name(device.name.clone());
scale.set_volume(&device.volume);
}

View file

@ -1,4 +1,4 @@
use gtk4::{glib, prelude::*};
use gtk4::{glib, prelude::*, subclass::prelude::*};
use libpulse_binding::volume::{ChannelVolumes, Volume};
use std::{
cell::{Cell, RefCell},
@ -11,21 +11,41 @@ use crate::PA;
// Component
struct VolumeScale {
scale: gtk4::Scale,
#[derive(Default)]
pub struct VolumeScaleImp {
name: Rc<RefCell<Option<String>>>,
}
#[glib::object_subclass]
impl ObjectSubclass for VolumeScaleImp {
const NAME: &'static str = "VolumeScale";
type Type = VolumeScale;
type ParentType = gtk4::Scale;
}
impl ObjectImpl for VolumeScaleImp {}
impl WidgetImpl for VolumeScaleImp {}
impl RangeImpl for VolumeScaleImp {}
impl ScaleImpl for VolumeScaleImp {}
glib::wrapper! {
pub struct VolumeScale(ObjectSubclass<VolumeScaleImp>)
@extends gtk4::Scale, gtk4::Range, gtk4::Widget,
@implements gtk4::Accessible, gtk4::Orientable;
}
impl VolumeScale {
fn new(pa: PA, sink: bool) {
let name: Rc<RefCell<Option<String>>> = Rc::new(RefCell::new(None));
let scale = gtk4::Scale::with_range(gtk4::Orientation::Horizontal, 0., 100., 1.);
pub fn new(pa: PA, sink: bool) -> Self {
let scale: VolumeScale = glib::Object::new(&[]).unwrap();
scale.set_range(0., 100.);
let name = scale.imp().name.clone();
let updater = Updater::new(move |value: f64| {
let name = name.clone();
let pa = pa.clone();
async move {
let mut volumes = ChannelVolumes::default();
volumes.set(0, Volume((value * 100.) as _)); // XXX ?
let volume = value * (Volume::NORMAL.0 as f64) / 100.;
volumes.set(1, Volume(volume as _)); // XXX ?
let name_ref = name.borrow();
if let Some(name) = name_ref.as_deref() {
@ -45,14 +65,16 @@ impl VolumeScale {
updater.update(value);
gtk4::Inhibit(false)
});
scale
}
fn set_value(&self, value: f64) {
self.scale.set_value(value);
pub fn set_volume(&self, volume: &ChannelVolumes) {
let value = volume.avg().0 as f64 / (Volume::NORMAL.0 as f64) * 100.;
self.set_value(value);
}
fn set_name(&self, name: Option<String>) {
*self.name.borrow_mut() = name;
pub fn set_name(&self, name: Option<String>) {
*self.imp().name.borrow_mut() = name;
}
}