2013-07-09 35 views
0

我试图在Spotify中制作一个收集音频数据的程序。我在API中看到有一个回调函数get_audio_buffer_stats,它具有口吃和样本。我试图将其添加到程序中(我只是修改了自动存储塔的示例),但即使在关闭wifi并等待歌曲停止播放时,它也只会打印0的断续和样本。通过添加代码,我的意思是我为它创建了回调函数,并将其添加到会话回调函数中。我错过了什么吗?任何人都可以帮助我使这个回调工作?谢谢!我的代码如下:Spotify会话回调get_audio_buffer_stats

static void get_audio_buffer_stats(sp_session *sess, sp_audio_buffer_stats *stats) 
{ 
pthread_mutex_lock(&g_notify_mutex); 

//log session data 
stuttervariable = stats->stutter; 
samplesvariable = stats->samples; 

printf("stutter, %d\n", stuttervariable); 
printf("samples, %d\n", samplesvariable); 

pthread_cond_signal(&g_notify_cond); 
pthread_mutex_unlock(&g_notify_mutex); 

} 

/** 
* The session callbacks 
*/ 
static sp_session_callbacks session_callbacks = { 
.logged_in = &logged_in, 
.notify_main_thread = &notify_main_thread, 
.music_delivery = &music_delivery, 
.metadata_updated = &metadata_updated, 
.play_token_lost = &play_token_lost, 
.log_message = NULL, 
.end_of_track = &end_of_track, 
.get_audio_buffer_stats = &get_audio_buffer_stats, 
}; 

回答

2

我觉得跟get_audio_buffer_stats的想法是,你应该告诉libspotify如果你遭受口吃多少样本被留在缓冲区。当它调用get_audio_buffer_stats时,它传递一个指向你应该填充的结构体的指针。假设你告诉libspotify你正在遭受口吃,它会尝试向你发送更多的数据来保持你的缓冲区更满。通过告诉libspotify你的缓冲区有多满,它可以适应你的时钟漂移,导致你消耗的音频比预期的稍快或者慢一些。

+0

这家伙是现货!来源:我为Spotify工作,并从事libspotify项目。 – iKenndac

+0

我该怎么做呢?那么我可以制作另一种方法吗?我该如何收集这些数据来回馈给callback/tell libspotify我正在遭受口吃? – user2565444

+0

此外,我应该填写sp_audio_buffer_stats的结构?如果是这样,我应该在哪里获取数据以填写样本和口吃? – user2565444