libspotify C отправка нулей в конце трека
Я использую libspotify SDK
C библиотека для win32.
Я думаю, чтобы иметь правильную настройку, каждый сеанс обратного вызова зарегистрирован. Я не понимаю, почему я не могу получить звонок для end_of_track
, в то время как music_delivery
продолжает вызываться с нулевым заполнением 22050
длинные кадры.
Я пытаюсь начать играть сначала загружая трек с sp_session_load
; пока не вернется SP_ERROR_IS_LOADING
Я публикую сообщение в своей очереди сообщений (метод синхронизации, который я использовал, PostMessage
win32 API) для повторной загрузки с тем же API sp_session_load
, Как только он вернется SP_ERROR_OK
Я использую sp_session_play
и music_delivery
начинается немедленно, с правильными кадрами.
Я не знаю, почему в конце трека libspotify
время выполнения, затем начните отправлять заполненные нулями кадры вместо вызова end_of_track
Перезвоните. В других условиях это работает отлично: я использовал sp_track
полученный из обзора альбома, поэтому дорожка полностью загружена в тот момент, когда я загружаюсь в текущую сессию для воспроизведения: с этой дорожкой она отлично работает с end_of_track
называется правильно. В случае ошибки заполнения я ищу трек, используя его Spotify URI, и получаю результаты; в этом случае метаданные трека еще не готовы (при попытке воспроизведения), поэтому я использовал этот тип "опроса" на sp_session_load
с PostMessage
,
Кто-нибудь может мне помочь?
1 ответ
Я столкнулся с той же проблемой, и я думаю, что проблема заключалась в том, что я потреблял данные слишком быстро, не давая другим потокам времени выполнять какую-либо работу, так как я тратил все свое время на music_delivery
Перезвоните. Я обнаружил, что если я добавлю некоторое регулирование и уведомлю основной поток о том, что он может проснуться, чтобы выполнить некоторую обработку, дополнительные нули в конце дорожки уменьшатся до одной доставки 22 050 кадров (или 500 мс при 44,1 кГц).
Вот пример того, что я добавил к своему обратному вызову, заимствованным из jukebox.c
Пример, предоставляемый с SDK:
/* Buffer 1 second of data, then notify the main thread to do some processing */
if (g_throttle > format->sample_rate) {
pthread_mutex_lock(&g_notify_mutex);
g_notify_do = 1;
pthread_cond_signal(&g_notify_cond);
pthread_mutex_unlock(&g_notify_mutex);
// Reset the throttle counter
g_throttle = 0;
return 0;
}
Как я уже сказал, до остановки трека было доставлено еще 22 050 кадров нулей, но я верю libspotify
может намеренно сделать это, чтобы гарантировать, что продолжительность рассчитывается по количеству полученных кадров (song_duration_ms = total_frames_delivered / sample_rate * 1000
) больше или равно продолжительности, сообщенной sp_track_duration
, В моем случае трек, который я пытался транслировать, был 172,000ms
по продолжительности, без дополнительного заполнения, рассчитанная длительность равна 171,796ms
но с подкладкой было 172,296ms
,
Надеюсь это поможет.