#![allow(missing_docs)]
#![no_std]
#![no_main]
use core::convert::Infallible;
use core::time::Duration as StdDuration;
use device_envoy_rp::{
Result,
audio_player::{
AtEnd, AudioPlayer as _, Gain, SilenceClip, VOICE_22050_HZ, Volume, audio_player, pcm_clip,
},
button::{ButtonRp, PressedTo},
tone,
};
use embassy_executor::Spawner;
use embassy_futures::select::{Either, select};
use embassy_time::{Duration, Timer};
use {defmt_rtt as _, panic_probe as _};
audio_player! {
AudioPlayer8 {
data_pin: PIN_8,
bit_clock_pin: PIN_9,
word_select_pin: PIN_10,
sample_rate_hz: VOICE_22050_HZ,
pio: PIO0,
dma: DMA_CH1,
max_clips: 8,
max_volume: Volume::spinal_tap(11),
initial_volume: Volume::spinal_tap(5),
}
}
pcm_clip! {
Nasa {
file: concat!(env!("CARGO_MANIFEST_DIR"), "/examples/data/audio/nasa_22k.s16"),
source_sample_rate_hz: VOICE_22050_HZ,
}
}
use device_envoy_rp::button::Button as _;
#[embassy_executor::main]
async fn main(spawner: Spawner) -> ! {
let err = example(spawner).await.unwrap_err();
core::panic!("{err}");
}
async fn example(spawner: Spawner) -> Result<Infallible> {
const fn ms(milliseconds: u64) -> StdDuration {
StdDuration::from_millis(milliseconds)
}
const SAMPLE_RATE_HZ: u32 = AudioPlayer8::SAMPLE_RATE_HZ;
const NASA: &AudioPlayer8Playable = &Nasa::adpcm_clip();
const GAP: &AudioPlayer8Playable = &SilenceClip::new(ms(80));
const CHIME: &AudioPlayer8Playable =
&tone!(880, SAMPLE_RATE_HZ, ms(100)).with_gain(Gain::percent(20));
let p = embassy_rp::init(Default::default());
let mut button = ButtonRp::new(p.PIN_13, PressedTo::Ground);
let audio_player8 = AudioPlayer8::new(p.PIN_8, p.PIN_9, p.PIN_10, p.PIO0, p.DMA_CH1, spawner)?;
const VOLUME_STEPS_PERCENT: [u8; 7] = [50, 25, 12, 6, 3, 1, 0];
loop {
button.wait_for_press().await;
audio_player8.play([CHIME, NASA, GAP], AtEnd::Loop);
for volume_percent in VOLUME_STEPS_PERCENT {
match select(
button.wait_for_press(),
Timer::after(Duration::from_secs(1)),
)
.await
{
Either::First(()) => {
break;
}
Either::Second(()) => {
audio_player8.set_volume(Volume::percent(volume_percent));
}
}
}
audio_player8.stop();
audio_player8.set_volume(
<AudioPlayer8 as device_envoy_rp::audio_player::AudioPlayer<
{ AudioPlayer8::SAMPLE_RATE_HZ },
>>::INITIAL_VOLUME,
);
}
}