libspotify C отправка нулей в конце трека

Я использую libspotify SDKC библиотека для 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,

Надеюсь это поможет.

Другие вопросы по тегам