1- use std:: fs:: OpenOptions ;
2- use std:: io:: { Cursor , Write } ;
1+ use std:: io:: Cursor ;
32use std:: sync:: { Arc , LazyLock } ;
43use std:: thread:: sleep;
54use std:: time:: Duration ;
@@ -19,7 +18,6 @@ use pulse::sample::{Format, Spec};
1918use pulse:: stream:: Direction ;
2019use rodio:: { Decoder , Source } ;
2120use serde:: { Deserialize , Serialize } ;
22- use tokio:: net:: UdpSocket ;
2321use tokio:: sync:: RwLock ;
2422
2523use crate :: CONFIG_DIR ;
@@ -232,153 +230,3 @@ pub async fn play_on_kira(audio: Vec<u8>) -> Result<()> {
232230 TTS_AUDIO_CONTROL . set_status_ready ( ) . await ;
233231 Ok ( ( ) )
234232}
235-
236- // ############################
237- // pub async fn play_on_pipe(audio: Vec<u8>, pipe: impl AsRef<str>) -> Result<()> {
238- // // let cursor = Cursor::new(audio);
239- // // let source = Decoder::new(cursor)?.convert_samples::<u16>();
240- // // let sample_rate = source.sample_rate();
241- // // let channels = source.channels() as u8;
242-
243- // let mut pipe = OpenOptions::new().write(true).open("/tmp/audio_pipe.mp3")?;
244- // // log_trace!("Sample rate: {}, channels {}.", sample_rate, channels);
245- // // log_trace!("Playing on pipe: {:?}", pipe.metadata());
246-
247- // // let audio_data = source.into_iter().collect::<Vec<_>>();
248-
249- // log_debug!("Setting audio player to busy");
250- // let audio_chunks = audio.chunks(1024);
251- // TTS_AUDIO_CONTROL.set_status_busy().await;
252-
253- // for chunk in audio_chunks {
254- // match TTS_AUDIO_CONTROL.get_status().await {
255- // PlayerCommands::Busy => {
256- // pipe.write(&chunk)?;
257- // sleep(Duration::from_millis(10));
258- // }
259- // PlayerCommands::Stop => {
260- // log_debug!("Stopping audio playback");
261- // TTS_AUDIO_CONTROL.set_status_ready().await;
262- // log_debug!("Setting audio player ready");
263- // break;
264- // }
265- // _ => {}
266- // }
267- // }
268- // log_debug!("Audio playback finished");
269- // TTS_AUDIO_CONTROL.set_status_ready().await;
270-
271- // Ok(())
272- // }
273-
274- // pub async fn play_udp(audio: Vec<u8>, _sink: impl AsRef<str>) -> Result<()> {
275- // let udp_socket = tokio::net::UdpSocket::bind("0.0.0.0:0").await?;
276- // udp_socket.connect("127.0.0.1:12345").await?;
277-
278- // let cursor = Cursor::new(audio);
279- // let source = Decoder::new(cursor)?.convert_samples::<f32>();
280- // let sample_rate = source.sample_rate();
281- // let channels = source.channels() as u8;
282-
283- // log_trace!("Sample rate: {}, channels {}.", sample_rate, channels);
284-
285- // // let (_stream, stream_handle) = OutputStream::try_default().unwrap();
286-
287- // let spec = Spec {
288- // format: Format::FLOAT32NE,
289- // channels,
290- // rate: sample_rate,
291- // };
292- // assert!(spec.is_valid());
293- // let audio_data = source.into_iter().collect::<Vec<_>>();
294- // // let audio_chunks = source.chunks(1024);
295-
296- // let audio_bytes = audio_data
297- // .iter()
298- // .flat_map(|&x| x.to_le_bytes().to_vec())
299- // .collect::<Vec<_>>();
300-
301- // let audio_chunks = audio_bytes.chunks(1024);
302- // // Calculate delay for each chunk (based on sample rate, channels, and chunk size)
303- // let chunk_size = 1024; // Size of each chunk in bytes
304- // let samples_per_chunk = chunk_size / std::mem::size_of::<f32>();
305- // let seconds_per_chunk = samples_per_chunk as f64 / (sample_rate as f64 * channels as f64);
306- // let delay = Duration::from_secs_f64(seconds_per_chunk);
307-
308- // TTS_AUDIO_CONTROL.set_status_busy().await;
309- // log_debug!("Setting audio player to busy");
310- // for chunk in audio_chunks {
311- // match TTS_AUDIO_CONTROL.get_status().await {
312- // PlayerCommands::Busy => {
313- // tokio::time::sleep(delay).await;
314- // }
315- // PlayerCommands::Stop => {
316- // log_debug!("Stopping audio playback");
317- // TTS_AUDIO_CONTROL.set_status_ready().await;
318- // log_debug!("Setting audio player ready");
319- // break;
320- // }
321- // _ => {}
322- // }
323- // }
324- // log_debug!("Audio playback finished");
325- // TTS_AUDIO_CONTROL.set_status_ready().await;
326- // Ok(())
327- // }
328-
329- // pub async fn play_udp(audio: Vec<u8>, _sink: impl AsRef<str>) -> Result<()> {
330- // let udp_socket = tokio::net::UdpSocket::bind("0.0.0.0:0").await?;
331- // udp_socket.connect("127.0.0.1:12345").await?;
332-
333- // udp_socket.send(&audio).await?;
334-
335- // return Ok(());
336- // let cursor = Cursor::new(audio);
337- // let source = Decoder::new(cursor)?.convert_samples::<i16>();
338-
339- // let sample_rate = source.sample_rate();
340- // let channels = source.channels() as u8;
341-
342- // log_debug!("Audio chunks duration: {:?}", source.inner().total_duration());
343-
344- // let audio_chunks = source.into_iter().collect::<Vec<_>>();
345- // log_debug!("Sample rate: {}, channels {}.", sample_rate, channels);
346-
347- // let audio_duration = audio_chunks.len() as u32 / (sample_rate * channels as u32);
348- // println!("Total chunk count: {}", audio_chunks.len() / channels as usize);
349- // println!("Audio duration: {:?}", audio_duration);
350- // println!(
351- // "duration of single chunk is {:?}",
352- // audio_duration as f32 / audio_chunks.len() as f32
353- // );
354-
355- // let spec = Spec {
356- // format: Format::F32le, // You can safely send this as f32le via `to_le_bytes()`
357- // channels,
358- // rate: sample_rate,
359- // };
360-
361- // TTS_AUDIO_CONTROL.set_status_busy().await;
362- // for chunk in audio_chunks {
363- // match TTS_AUDIO_CONTROL.get_status().await {
364- // PlayerCommands::Busy => {
365- // // TODO: send chunk (e.g. over UDP, to pipe, etc.)
366- // // Convert f32 samples to bytes
367- // let bytes = chunk.to_le_bytes();
368-
369- // //Example: send via socket or write to pipe
370- // udp_socket.send(&bytes).await?;
371-
372- // // tokio::time::sleep(chunk_duration).await;
373- // }
374- // PlayerCommands::Stop => {
375- // TTS_AUDIO_CONTROL.set_status_ready().await;
376- // break;
377- // }
378- // _ => {}
379- // }
380- // }
381-
382- // TTS_AUDIO_CONTROL.set_status_ready().await;
383- // Ok(())
384- // }
0 commit comments