2015-02-22 4 views
0

Я пытаюсь создать проект, в котором я использую ohLibspotify. Net libspotify wrapper для входа в систему, чтобы определить и воспроизвести плейлисты.ohLibspotify не вызывает никакого обратного вызова после входа в систему

Насколько я могу судить, я установил все так же, как в примере. Сначала нужно создать сеанс следующим образом:

SpotifySessionConfig sp_config = new SpotifySessionConfig() 
     { 
      ApiVersion = 12, 
      CacheLocation = "cache", 
      SettingsLocation = "settings", 
      UserAgent = "player", 
      ApplicationKey = Properties.Resources.appkey, 
      Listener = new sp_Listener() 
     }; 
sp_session = SpotifySession.Create(sp_config); 

Тогда я называю relogin(), если это не удается, чем я показываю окно входа в систему для пользователя, потому что никакие сохраненные учетные данные не были найдены. Когда пользователь предоставил мне данные своей учетной записи, я звоню login(username, password, true, null). После этого я жду вызова в класс sp_Listener.

В sp_Listener классе я переопределены следующие функции:

SpotifySessionListener.LoggedIn(SpotifySession session, SpotifyError error) 
SpotifySessionListener.ConnectionError(SpotifySession session, SpotifyError error) 
SpotifySessionListener.LogMessage(SpotifySession session, string data) 

только обратный вызов, который вызывается является LogMessage обратного вызова. Я подключил его к log4net, чтобы эффективно читать весь вывод. Это все LogMessage выхода:

2015-02-22 20:58:38,636 [18] DEBUG Namespace.sp_Listener - 19:58:38.634 I [c:/Users/spotify-buildagent/BuildAgent/work/1e0ce8a77adfb2dc/client/core/session/offline_authorizer.cpp:297] Unable to login offline: no such user 

2015-02-22 20:58:38,649 [18] DEBUG Namespace.sp_Listener - 19:58:38.649 I [c:/Users/spotify-buildagent/BuildAgent/work/1e0ce8a77adfb2dc/client/core/session/offline_authorizer.cpp:297] Unable to login offline: no such user 

2015-02-22 20:58:38,651 [14] DEBUG Namespace.sp_Listener - 19:58:38.649 E [c:/Users/spotify-buildagent/BuildAgent/work/1e0ce8a77adfb2dc/client/core/network/proxy_resolver_win32.cpp:215] WinHttpGetProxyForUrl failed 

2015-02-22 20:58:38,664 [19] DEBUG Namespace.sp_Listener - 19:58:38.661 I [ap:1752] Connecting to AP ap.gslb.spotify.com:4070 

2015-02-22 20:58:38,713 [19] DEBUG Namespace.sp_Listener - 19:58:38.713 I [ap:1226] Connected to AP: 193.182.7.34:4070 

Похоже, я должен что-то забыл. Я понятия не имею, что, может быть, один из вас, ребята, знает решение.

+1

Вы вызываете sp_session.ProcessEvents? – Weeble

+0

Вы, сэр, только что сохранили жизнь немца! Спасибо! – Feanaro

ответ

3

Я являюсь оригинальным автором библиотеки обложек ohLibSpotify. Я думаю, вы, возможно, проигнорировали необходимость вызова ProcessEvents. ohLibSpotify пытается как можно дальше предоставить только тонкий слой поверх libspotify. Почти все в документах libspotify остается актуальным, когда вы используете ohLibSpotify, и вы должны рассмотреть эти документы своим первым портом-вызовом. https://developer.spotify.com/docs/libspotify/12.1.51/index.html

В частности:

Библиотека сама использует несколько потоков внутри. Чтобы обеспечить синхронизацию между этими потоками, вы должны реализовать обратный вызов sp_session_callbacks :: notify_main_thread. Всякий раз, когда вы вызываете (из некоторого внутреннего потока), приложение должно разбудить основной цикл, чтобы можно было запустить функцию sp_session_process_events().

Сам API не является потокобезопасным. Таким образом, вы должны позаботиться о том, чтобы не вызывать функции API из более чем одного из ваших собственных потоков.

Имена немного отличаются, но концепции те же - вам нужно реализовать NotifyMainThread, чтобы получать уведомления о том, что libspotify хочет общаться с вами, то вам необходимо убедиться, что ваш основной поток вызывает sp_session.ProcessEvents. Вы также должны убедиться, что только один поток когда-либо взаимодействует с ohLibSpotify за один раз, либо путем координации, чтобы только один поток вызывал ohLibSpotify, либо используя соответствующие блокировки вокруг вызовов в ohLibSpotify.

(я использую libspotify имена здесь: следующие советы в равной степени относится ли вы используете libspotify каталог или ohLibSpotify.)

С некоторыми исключениями, libspotify только когда-либо вызывает обратные вызовы внутри вызова sp_session_process_events , (Исключения - notify_main_thread и обратные вызовы, связанные с доставкой музыки.) Поэтому, если вы не настроены регулярно звонить, вы обнаружите, что libspotify не очень-то работает. Если ваша программа имеет цикл событий, вы должны организовать отправку событий каждый раз, когда вы получаете обратный вызов notify_main_thread или когда прошло время, указанное вашим последним вызовом sp_session_process_events, и вызовите sp_session_process_events в обработчике событий.Если у вас нет цикла событий, вы можете создать поток для этой цели и не забудьте использовать соответствующие блокировки, чтобы одновременно запретить другим потокам звонить в libspotify.