# sys.waveOut 库模块帮助文档

[波形音频输出](https://www.aardio.com/zh-cn/docs/library/sys/waveOut/)

## sys 成员列表 <a id="sys" href="#sys">&#x23;</a>

### sys.waveOut <a id="sys.waveOut" href="#sys.waveOut">&#x23;</a>
把 16 位 PCM 送往系统默认播放设备（Windows waveOut）。  
只接收 PCM，不解码；WAV 文件需先解析出格式和音频数据，MP3 可先用 sys.mediaFoundation.mp3Decoder 解码。  
设备异步播放，PCM 一直保留到 close。所有方法在创建对象的线程调用。  
[使用指南](https://www.aardio.com/zh-cn/docs/library/sys/waveOut/)

### sys.waveOut(options) <a id="sys.waveOut" href="#sys.waveOut">&#x23;</a>
打开默认播放设备，失败返回 null,错误信息。  
options 必须指定 sampleRate（Hz）与 channels（1 或 2）；  
可选 volume=1（0..1，软件音量，不改系统音量），bitsPerSample 只能是 16。  
可直接传入 sys.mediaFoundation.mp3Decoder 的 format 字段。  

[返回对象:sysWaveOutObject](#sysWaveOutObject)

## sysWaveOutObject 成员列表 <a id="sysWaveOutObject" href="#sysWaveOutObject">&#x23;</a>

### sysWaveOutObject.close() <a id="sysWaveOutObject.close" href="#sysWaveOutObject.close">&#x23;</a>
立即停止播放并释放设备与全部 PCM，可重复调用。成功返回 true。  
失败返回 null,err 并保留仍被设备引用的内存，可再次调用 close。

### sysWaveOutObject.completedBytes <a id="sysWaveOutObject.completedBytes" href="#sysWaveOutObject.completedBytes">&#x23;</a>
设备已播放完的 PCM 字节数，poll 时更新。  
等于 totalBytes 表示已写入的数据全部播完

### sysWaveOutObject.format <a id="sysWaveOutObject.format" href="#sysWaveOutObject.format">&#x23;</a>
输出格式：codec="pcm",sampleRate,channels,bitsPerSample=16

### sysWaveOutObject.handle <a id="sysWaveOutObject.handle" href="#sysWaveOutObject.handle">&#x23;</a>
waveOut 设备句柄，close 后为 null

### sysWaveOutObject.playedSeconds <a id="sysWaveOutObject.playedSeconds" href="#sysWaveOutObject.playedSeconds">&#x23;</a>
设备报告的播放位置（秒），poll 时更新；不是扬声器声学测量

### sysWaveOutObject.poll() <a id="sysWaveOutObject.poll" href="#sysWaveOutObject.poll">&#x23;</a>
刷新 completedBytes 与 playedSeconds，成功返回 true，失败返回 null,err。  
不调用也会正常播放，只是这两个属性不更新。

### sysWaveOutObject.totalBytes <a id="sysWaveOutObject.totalBytes" href="#sysWaveOutObject.totalBytes">&#x23;</a>
已提交给设备的 PCM 字节数

### sysWaveOutObject.volume <a id="sysWaveOutObject.volume" href="#sysWaveOutObject.volume">&#x23;</a>
软件音量 0..1，修改后只影响之后写入的数据

### sysWaveOutObject.wait(timeoutMs) <a id="sysWaveOutObject.wait" href="#sysWaveOutObject.wait">&#x23;</a>
等待已写入的数据全部播放完，期间处理窗口消息。成功返回 true，失败返回 null,err。  
省略 timeoutMs 则一直等待；超时只结束等待，不停止播放。

### sysWaveOutObject.write(pcm) <a id="sysWaveOutObject.write" href="#sysWaveOutObject.write">&#x23;</a>
追加 16 位交错 PCM（字符串或 buffer），成功返回 true，失败返回 null,err。  
长度必须是 channels*2 的整数倍。数据会复制，返回后可以复用或修改原 buffer。  
设备异步播放，write 立即返回。
