#audio-devices #audio-samples #low-level #operating-system #linux-macos #output

tinyaudio

TinyAudio是一个跨平台、易于使用、低级的音频输出库

5个版本

0.1.4 2024年7月25日
0.1.3 2024年3月4日
0.1.2 2023年7月18日
0.1.1 2023年4月17日
0.1.0 2023年3月14日

#31 in 音频

Download history 171/week @ 2024-05-01 123/week @ 2024-05-08 152/week @ 2024-05-15 239/week @ 2024-05-22 248/week @ 2024-05-29 251/week @ 2024-06-05 264/week @ 2024-06-12 153/week @ 2024-06-19 174/week @ 2024-06-26 81/week @ 2024-07-03 136/week @ 2024-07-10 160/week @ 2024-07-17 418/week @ 2024-07-24 209/week @ 2024-07-31 267/week @ 2024-08-07 139/week @ 2024-08-14

1,060 每月下载量
用于9 Crate(其中4个直接使用)

MIT许可证

46KB
873 代码行

TinyAudio

TinyAudio是一个跨平台音频输出库。其主要目标是尽可能简单地提供对操作系统默认声音输出设备的统一访问,支持包括PC(Windows、Linux、macOS)、移动设备(Android、iOS)和WebAssembly在内的多个平台。

这个Crate能做什么

Crate仅接受您准备好的数据并将其发送到默认操作系统的声音输出设备。它使用浮点音频样本并将其自动转换为最接近的受支持的平台相关格式。该Crate保证中间数据缓冲区始终为请求的大小。如果您需要尽可能容易地播放音频样本,请使用此Crate。

这个Crate不能做什么

它不加载任何声音格式,不应用任何数字信号处理(DSP)技术,不进行音频空间化等等。此外,该Crate不支持设备枚举、设备选择、查询支持的格式、输入捕获(例如麦克风)。

支持的平台

Windows Linux macOS WebAssembly Android iOS

它如何工作

Crate内部创建音频输出上下文,并使用用户定义的回调向设备提供要播放的样本。回调将定期调用以生成新数据;它将在设备实例“存活”期间被调用。换句话说,这个Crate执行最简单的音频流。

Android详细信息

本软件包在Android平台使用AAudio进行音频输出。AAudio是一个相对较新的API,于2017年左右(在Android 8.1奥利奥中)被添加。这意味着您必须使用API Level 26+才能使软件包正常运行。此外,您必须在您的应用程序获得焦点后(在android-activity软件包中的GainedFocus事件)初始化音频设备,否则设备创建将失败。请参阅android-examples目录中的示例。

WebAssembly细节

如今,大多数网络浏览器都需要用户执行一个“确认”动作(通常是一个按钮点击或其他类似操作)才能允许网页播放音频。这意味着您必须在执行WebAssembly包的网页上的某些操作后初始化音频设备。在最简单的情况下,这可能是一个带有初始化音频设备的回调的简单按钮。请参阅wasm-examples目录中的示例。

示例

该软件包非常易于使用,以下是一些示例,可以帮助您立即开始使用它。

初始化

显示如何初始化输出设备的最简单示例。

use tinyaudio::prelude::*;

let _device = run_output_device(
    OutputDeviceParameters {
        channels_count: 2,
        sample_rate: 44100,
        channel_sample_count: 4410,
    },
    move |_| {
        // Output silence
    },
)
.unwrap();

std::thread::sleep(std::time::Duration::from_secs(1));

播放正弦波

一个简单的示例,播放440 Hz的正弦波,如下所示

# use tinyaudio::prelude::*;
let params = OutputDeviceParameters {
    channels_count: 2,
    sample_rate: 44100,
    channel_sample_count: 4410,
};

let _device = run_output_device(params, {
    let mut clock = 0f32;
    move |data| {
        for samples in data.chunks_mut(params.channels_count) {
            clock = (clock + 1.0) % params.sample_rate as f32;
            let value =
                (clock * 440.0 * 2.0 * std::f32::consts::PI / params.sample_rate as f32).sin();
            for sample in samples {
                *sample = value;
            }
        }
    }
})
.unwrap();

std::thread::sleep(std::time::Duration::from_secs(5));

依赖项

~0–3MB
~47K SLoC