如何使用struct sp_audio_buffer_stats

时间:2013-07-12 18:04:38

标签: spotify libspotify

如何使用libspotify api中的sp_audio_buffer_stats(我正在修改自动点唱机示例)?我不明白如何填写口吃和样本变量,或在哪里声明它等。它是否来自代码的缓冲区部分?如果是这样,那将是music_delivery方法(来自自动点唱机示例)吗?

1 个答案:

答案 0 :(得分:1)

概述

要使用libspotify播放音频,首先要注册music_delivery回调和get_audio_buffer_stats回调。您建立一个登录会话,调用sp_session_player_load来加载一个轨道,等待它准备就绪,然后调用sp_session_player_play开始播放。

此时,libspotify将开始调用您的music_delivery以定期传送音频数据。通常,您将此数据写入本地缓冲区,并使用其他库来播放该缓冲区中的音频。最有可能的是,该库还会向您发出请求缓冲区数据的常规回调。如果libspotify无法足够快地传送音频数据,最终你的库会询问你的音频数据,你将无法提供音频数据,此时声音将会断断续续或退出。

为了避免这种情况,libspotify还会调用get_audio_buffer_stats来查看您最近是否遇到了丢失以及缓冲区中剩余多少音频,并调整它从服务器下拉音频的速率以进行补偿。 / p>

您如何使用sp_audio_buffer_stats?

您可以使用它来告诉libspotify您的音频缓冲区的当前状态以及自上次查询以来您已经丢失的数量。

如何填写口吃和样本变量?

Stutter应该是您用完音频数据的次数,并且无法按时将其传送到播放音频的任何内容,从而导致声音断断续续或退出。

我假设,但不是100%肯定,样本应该是您当前缓冲的样本数 - 即您从libspotify收到并存储但尚未播放的样本数。我猜这是以帧为单位测量的,即每个通道的样本,因为你无法有效地细分帧。

我在哪里声明它?

我真的不明白这部分问题。你的意思是在哪里定义get_audio_buffer_stats回调函数?在定义music_delivery回调的同一位置定义它可能是最有意义的。你的意思是存储sp_audio_buffer_stats结构的位置?你不这样做 - 你的回调会收到一个已经存在的指针并将你填入。

它是否来自代码的缓冲区部分?

同样,我不确定我在这里理解。将数据放入缓冲区并将其再次取出的代码是具有报告断断续续和缓冲状态的信息的部分。在自动唱片点唱机示例中,音频数据包被缓冲在名为audio_fifo_t的数据结构中。我不相信它有任何记账来跟踪缓冲区中的样本数量或断断续续的数量,但你可以想象它可以添加到audio.c,audio.h中,也可能是平台特定的音频代码。

那会是music_delivery方法吗?

我不明白。 music_delivery方法确实将音频放入缓冲区,因此从这个意义上说它直接或间接地增加了缓冲区中的样本数量。它对口吃的数量没有影响 - 当尝试将缓冲区的音频输出时会发生这种情况。

我不隶属于Spotify。我已经使用音乐播放API编写实验代码以将音频发送到网络音乐播放器,所以虽然我有实现music_delivery和get_audio_buffer_stats的经验,但我没有太多将其传递给传统音频API的经验。

另见:spotify session callback get_audio_buffer_stats