# bass.streamPlayer 库模块帮助文档

## bass 成员列表 <a id="bass" href="#bass">&#x23;</a>

### bass.streamPlayer <a id="bass.streamPlayer" href="#bass.streamPlayer">&#x23;</a>
通用增量压缩音频播放器。  
同一实例接收一个连续的 MP3/OGG 等文件字节流，不是 PCM，不是独立 MP3 文件的播放列表。  
创建/写入/结束/关闭均在同一 aardio 消息循环线程。  
无需等完整文件。部分写入自动排队，缓冲超限会明确失败，不丢数据。  
注意只写入确认是音频的数据：BASS 内部用 Media Foundation 探测无法识别的数据时，  
可能占满 32 位进程的地址空间，详见指南「已知问题」。  
只播放 MP3 可改用免费的 sys.mediaFoundation.streamingMp3Player。  
[使用指南](https://www.aardio.com/zh-cn/docs/library/bass/streamPlayer/)  

建议改用 sys.mediaFoundation.streamingMp3Player（不增加软件体积）

### bass.streamPlayer(options) <a id="bass.streamPlayer" href="#bass.streamPlayer">&#x23;</a>
创建播放器。options 可省略。  
可选 initialBytes=2048,maxInitialBytes=65536,maxBufferBytes=4194304,volume=1,autoPlay=true,onStart,onEnd,onError。  
volume 为 0..1；autoPlay=false 可先缓存，调用 play 后播放。  

[返回对象:bassStreamPlayerObject](#bassStreamPlayerObject)

## bassStreamPlayerObject 成员列表 <a id="bassStreamPlayerObject" href="#bassStreamPlayerObject">&#x23;</a>

### bassStreamPlayerObject.bufferedBytes <a id="bassStreamPlayerObject.bufferedBytes" href="#bassStreamPlayerObject.bufferedBytes">&#x23;</a>
aardio 层尚未送入 BASS 的字节数（不含 BASS 内部缓冲）。

### bassStreamPlayerObject.channel <a id="bassStreamPlayerObject.channel" href="#bassStreamPlayerObject.channel">&#x23;</a>
初始化成功后为 bass.channel 对象，结束/关闭后为 null。不要自行 free，请调用播放器 close。  

[返回对象:basschannelObject](#basschannelObject)

### bassStreamPlayerObject.close() <a id="bassStreamPlayerObject.close" href="#bassStreamPlayerObject.close">&#x23;</a>
立即停止并释放本实例资源，可重复调用；不触发 onEnd。不影响其他播放器。

### bassStreamPlayerObject.done <a id="bassStreamPlayerObject.done" href="#bassStreamPlayerObject.done">&#x23;</a>
是否结束、关闭或失败。

### bassStreamPlayerObject.error <a id="bassStreamPlayerObject.error" href="#bassStreamPlayerObject.error">&#x23;</a>
失败信息。

### bassStreamPlayerObject.finish(err) <a id="bassStreamPlayerObject.finish" href="#bassStreamPlayerObject.finish">&#x23;</a>
标记没有后续输入。先送完缓存再发送 EOF；不会截断尚未播放的声音。可重复调用。  
真正播放结束触发 onEnd。  
可选 err 表示来源失败（错误字符串或含 message 的错误表）：立即停止并触发 onError。

### bassStreamPlayerObject.inputEnded <a id="bassStreamPlayerObject.inputEnded" href="#bassStreamPlayerObject.inputEnded">&#x23;</a>
是否已调用 finish。

### bassStreamPlayerObject.pause() <a id="bassStreamPlayerObject.pause" href="#bassStreamPlayerObject.pause">&#x23;</a>
暂停播放，输入仍可继续，仍受缓存上限约束。

### bassStreamPlayerObject.play() <a id="bassStreamPlayerObject.play" href="#bassStreamPlayerObject.play">&#x23;</a>
开始或继续播放，也可在尚未收到音频时调用。

### bassStreamPlayerObject.receivedBytes <a id="bassStreamPlayerObject.receivedBytes" href="#bassStreamPlayerObject.receivedBytes">&#x23;</a>
已接收的编码字节总数。

### bassStreamPlayerObject.state <a id="bassStreamPlayerObject.state" href="#bassStreamPlayerObject.state">&#x23;</a>
buffering,playing,paused,ended,closed,failed。

### bassStreamPlayerObject.wait(timeoutMs) <a id="bassStreamPlayerObject.wait" href="#bassStreamPlayerObject.wait">&#x23;</a>
消息泵等待真正播放完毕。成功 true，失败 null,错误字符串。  
超时仅停止等待，不自动关闭；请按需 close。

### bassStreamPlayerObject.write(data) <a id="bassStreamPlayerObject.write" href="#bassStreamPlayerObject.write">&#x23;</a>
追加编码文件字节。成功返回 true，失败返回 null,错误字符串。空块无操作，不代表 EOF。  
内部复制数据，调用返回后可以复用输入 buffer。

## bassStreamPlayerObject 事件列表 <a id="bassStreamPlayerObjectEvent" href="#bassStreamPlayerObjectEvent">&#x23;</a>

### bassStreamPlayerObject.onEnd <a id="bassStreamPlayerObject.onEnd" href="#bassStreamPlayerObject.onEnd">&#x23;</a>

```aardio
bassStreamPlayerObject.onEnd = function(){  
    /*输入已结束且声音已播完，资源已释放*/  
}
```

### bassStreamPlayerObject.onError <a id="bassStreamPlayerObject.onError" href="#bassStreamPlayerObject.onError">&#x23;</a>

```aardio
bassStreamPlayerObject.onError = function(err){  
    /*播放失败，资源已释放*/  
}
```

### bassStreamPlayerObject.onStart <a id="bassStreamPlayerObject.onStart" href="#bassStreamPlayerObject.onStart">&#x23;</a>

```aardio
bassStreamPlayerObject.onStart = function(){  
    /*首次启动播放请求，owner 为播放器；不是声卡首样本时间*/  
}
```

