souvlaki 0.3.0

A cross-platform media key and metadata handling library.
Documentation
use std::{
    collections::VecDeque,
    sync::{Arc, Mutex},
};

use souvlaki::{MediaControlEvent, MediaControls};
use souvlaki::{MediaMetadata, MediaPlayback};
use winit::{
    event::{Event, WindowEvent},
    event_loop::{ControlFlow, EventLoop},
    window::WindowBuilder,
};

struct TestApp {
    playing: bool,
}

fn main() {
    let event_loop = EventLoop::new();
    let window = WindowBuilder::new().build(&event_loop).unwrap();

    #[cfg(target_os = "windows")]
    let mut controls = {
        use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};

        let handle = match window.raw_window_handle() {
            RawWindowHandle::Windows(h) => h,
            _ => unreachable!(),
        };
        MediaControls::for_window(handle).unwrap()
    };
    #[cfg(target_os = "macos")]
    let mut controls = MediaControls::new();
    #[cfg(all(not(target_os = "windows"), not(target_os = "macos")))]
    let mut controls = MediaControls::new();

    let pending_events = Arc::new(Mutex::new(VecDeque::new()));
    let mut app = TestApp { playing: true };

    controls
        .attach({
            let pending_events = pending_events.clone();
            move |event| {
                pending_events.lock().unwrap().push_back(event);
            }
        })
        .unwrap();
    controls.set_playback(MediaPlayback::Playing).unwrap();
    controls
        .set_metadata(MediaMetadata {
            title: Some("When The Sun Hits"),
            album: Some("Souvlaki"),
            artist: Some("Slowdive"),
            cover_url: Some("https://c.pxhere.com/photos/34/c1/souvlaki_authentic_greek_greek_food_mezes-497780.jpg!d"),
        })
        .unwrap();

    event_loop.run(move |event, _, control_flow| {
        *control_flow = ControlFlow::Poll;

        match event {
            Event::WindowEvent {
                event: WindowEvent::CloseRequested,
                ..
            } => *control_flow = ControlFlow::Exit,
            Event::MainEventsCleared => {
                let mut change = false;

                if let Ok(mut events) = pending_events.try_lock() {
                    while let Some(event) = events.pop_front() {
                        match event {
                            MediaControlEvent::Toggle => app.playing = !app.playing,
                            MediaControlEvent::Play => app.playing = true,
                            MediaControlEvent::Pause => app.playing = false,
                            _ => {}
                        }
                        change = true;
                    }
                }

                if change {
                    controls
                        .set_playback(if app.playing {
                            MediaPlayback::Playing
                        } else {
                            MediaPlayback::Paused
                        })
                        .unwrap();
                    eprintln!(
                        "App is now: {}",
                        if app.playing { "playing" } else { "paused" }
                    );
                }
            }
            _ => (),
        }
    });
}