1
0
Fork 0
mirror of https://github.com/librespot-org/librespot.git synced 2025-10-03 09:49:31 +02:00
librespot/connect
Felix Prillwitz be37402421
Expose possible mixer opening errors (#1488)
* playback: handle errors when opening mixer

* chore: update CHANGELOG.md

* fix tests and typo
2025-07-14 17:39:33 +02:00
..
src fix: playback of uris by api request (#1509) 2025-06-26 17:39:49 +02:00
Cargo.toml Shuffle tracks in place (#1445) 2025-02-02 22:58:30 +01:00
README.md Expose possible mixer opening errors (#1488) 2025-07-14 17:39:33 +02:00

Connect

The connect module of librespot. Provides the option to create your own connect device and stream to it like any other official spotify client.

The [Spirc] is the entrypoint to creating your own connect device. It can be configured with the given [ConnectConfig] options and requires some additional data to start up the device.

When creating a new [Spirc] it returns two items. The [Spirc] itself, which is can be used as to control the local connect device. And a Future, lets name it SpircTask, that starts and executes the event loop of the connect device when awaited.

A basic example in which the Spirc and SpircTask is used can be found here: examples/play_connect.rs.

Example

use std::{future::Future, thread};

use librespot_connect::{ConnectConfig, Spirc};
use librespot_core::{authentication::Credentials, Error, Session, SessionConfig};
use librespot_playback::{
    audio_backend, mixer,
    config::{AudioFormat, PlayerConfig},
    mixer::{MixerConfig, NoOpVolume},
    player::Player
};

async fn create_basic_spirc() -> Result<(), Error> {
    let credentials = Credentials::with_access_token("access-token-here");
    let session = Session::new(SessionConfig::default(), None);

    let backend = audio_backend::find(None).expect("will default to rodio");

    let player = Player::new(
        PlayerConfig::default(),
        session.clone(),
        Box::new(NoOpVolume),
        move || {
            let format = AudioFormat::default();
            let device = None;
            backend(device, format)
        },
    );

    let mixer = mixer::find(None).expect("will default to SoftMixer");

    let (spirc, spirc_task): (Spirc, _) = Spirc::new(
        ConnectConfig::default(),
        session,
        credentials,
        player,
        mixer(MixerConfig::default())?
    ).await?;

    Ok(())
}