rust-sdks icon indicating copy to clipboard operation
rust-sdks copied to clipboard

What does "engine is closed" mean?

Open kristian1108 opened this issue 1 year ago • 0 comments

This code is crashing with this error:

async fn publish_loop() -> Result<(JoinHandle<()>, NativeAudioSource)> {
    const FRAME_DURATION: Duration = Duration::from_millis(1000);
    let file_data = read_samples_from_file(FRAME_DURATION).await?;

    let source = NativeAudioSource::new(
        AudioSourceOptions::default(),
        file_data.sample_rate,
        file_data.num_channels as u32,
        None,
    );

    let source_clone = source.clone();
    let mut frame_index = 0;
    let max_frame_index = file_data.data_frames.len() - 1;
    let handle = tokio::spawn(async move {
        loop {
            if frame_index > max_frame_index {
                frame_index = 0;
            }
            let frame = &file_data.data_frames[frame_index];
            let frame_size = frame.len();
            println!("Writing frame size: {}", frame_size);
            let audio_frame = AudioFrame {
                data: frame.into(),
                num_channels: file_data.num_channels as u32,
                sample_rate: file_data.sample_rate,
                samples_per_channel: (frame_size / file_data.num_channels as usize) as u32,
            };
            source_clone.capture_frame(&audio_frame).await.unwrap();
            frame_index += 1;
        }
    });

    Ok((handle, source))
}

async fn receive_loop() -> Result<JoinHandle<()>>
{
    let url = String::from("<LIVEKIT_URL>");
    let token = create_token("some-room".to_string()).unwrap();

    let (_, mut rx) = Room::connect(&url, &token, RoomOptions::default())
        .await
        .unwrap();

    let event_loop = tokio::spawn(async move {
        while let Some(msg) = rx.recv().await {
            println!("Event: {:?}", msg);
        }
    });

    Ok(event_loop)
}


#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let url = String::from("<LIVEKIT_URL>");
    let token = create_token("some-room".to_string()).unwrap();

    let (room, mut rx) = Room::connect(&url, &token, RoomOptions::default())
        .await
        .unwrap();
    let room = Arc::new(room);

    let (handle, source) = publish_loop().await?;
    let receive_handle = receive_loop().await?;

    let track = LocalAudioTrack::create_audio_track("file", RtcAudioSource::Native(source.clone()));

    room.local_participant()
        .publish_track(
            LocalTrack::Audio(track),
            TrackPublishOptions {
                source: TrackSource::Microphone,
                ..Default::default()
            },
        )
        .await.unwrap();

    handle.await.unwrap();
    receive_handle.await.unwrap();

    room.close().await.expect("failed to close room");

    Ok(())
}
Writing frame size: 48000
Event: Connected { participants_with_tracks: [] }
Event: ConnectionStateChanged(Connected)
thread 'main' panicked at src/main.rs:244:16:
called `Result::unwrap()` on an `Err` value: Engine(Connection("engine is closed"))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

I'm not clear what the engine is or how to reset it. Any help would be much appreciated 🙏

kristian1108 avatar Sep 20 '24 18:09 kristian1108