avplayer 0.7.0

Safe Rust bindings for Apple's AVPlayer + AVAssetReader — playback and frame-by-frame asset reading on macOS
Documentation
mod support;

use avplayer::prelude::*;

const fn assert_next_item<T>(_: doom_fish_utils::stream::NextItem<'_, T>) {}

fn assert_caption_validation_stream_api(
    adaptor: &AssetReaderOutputCaptionAdaptor,
) -> Result<(), AVPlayerError> {
    let stream = adaptor.validation_event_stream(8)?;
    let _ = stream.buffered_count();
    let _ = stream.try_next();
    assert_next_item(stream.next());
    stream.clear_buffer();
    Ok(())
}

#[test]
fn asset_download_event_stream_closes_when_session_drops() -> support::TestResult {
    let identifier = format!("tests.avplayer.asset-download.{}", std::process::id());
    let (session, stream) = AssetDownloadURLSession::background_events(&identifier, 8)?;
    assert_eq!(stream.buffered_count(), 0);
    assert!(stream.try_next().is_none());
    assert_next_item(stream.next());
    assert!(!stream.is_closed());
    stream.clear_buffer();
    drop(session);
    assert!(stream.is_closed());
    Ok(())
}

#[test]
fn resource_loader_event_stream_subscribes() -> support::TestResult {
    let asset = support::loaded_audio_asset("async-stream-resource-loader")?;
    let loader = asset.resource_loader();
    let stream = loader.loading_request_stream(8)?;
    assert_eq!(stream.buffered_count(), 0);
    assert!(stream.try_next().is_none());
    assert_next_item(stream.next());
    assert!(!stream.is_closed());
    stream.clear_buffer();
    drop(stream);
    Ok(())
}

#[test]
fn caption_validation_stream_api_compiles() {
    let _: fn(&AssetReaderOutputCaptionAdaptor) -> Result<(), AVPlayerError> =
        assert_caption_validation_stream_api;
}