2013-08-08 2 views
2

질문이 아주 간단하게 들리지만 트랙 URL이 정확한지 확인하는 방법을 찾지 못했습니다.libspotify : 트랙 uri에서 트랙을 재생하는 방법?

예를 들어, 통상의 절차는 소정의 유효한 트랙하여 트랙을 재생하는 URI 스포티 파이 : 트랙 : 5Z7ygHQo02SUrFmcgpwsKW이다 :

1) (CONST 숯 * $으로의 track_uri)

2 sp_link_create_from_string하여 * sp_link 얻을) (sp_link의 *)

3) sp_track_add_ref (sp_track *)

4) sp_track_error()가 SP_ERROR_OK, 또는 SP_ERROR_IS_LOADING을 반환하는 경우 만 metadata_updated 및

sp_link_as_track에 의해 sp_track * 수

SP_ERROR_OK 다음 sp_session_player_load 및 sp_session_player_play를 사용하여 트랙을로드하고 재생하십시오.

5) sp_track_release() 및 sp_session_player_unload()가 트랙의 끝 부분에있을 때.

내가 SP_ERROR_IS_LOADING 반환) (올바른 URI sp_track_error 놀 수행하려고

,

라는 결코 극복 metadata_updated, 물론이 hangs.I 프로그램은 많은 URI

을 확인하고 같은를 얻을 수 결과.

API를 놓치거나 잘못 이해 했습니까?

이 메인 루프는 다음과 같습니다

pthread_mutex_lock(&g_notify_mutex); 
    for(;;) 
    { 

     if (next_timeout == 0) 
     { 
      while(!g_notify_do && !g_playback_done) 
      { 
       pthread_cond_wait(&g_notify_cond, &g_notify_mutex); 
      } 

     } 
     else 
     { 
      struct timespec ts; 

#if _POSIX_TIMERS > 0 
      clock_gettime(CLOCK_REALTIME, &ts); 
#else 
      struct timeval tv; 
      gettimeofday(&tv, NULL); 
      TIMEVAL_TO_TIMESPEC(&tv, &ts); 
#endif 
      printf("%d\n",next_timeout); 
      if((ts.tv_nsec+(next_timeout % 1000) * 1000000)>=1000000000) 
      { 
       ts.tv_nsec += (next_timeout % 1000) * 1000000-1000000000; 
       ts.tv_sec += next_timeout/1000+1; 
      } 
      else 
      { 
       ts.tv_sec += next_timeout/1000; 
       ts.tv_nsec += (next_timeout % 1000) * 1000000; 
      } 
      pthread_cond_timedwait(&g_notify_cond, &g_notify_mutex, &ts); 
     } 

     g_notify_do = 0; 
     pthread_mutex_unlock(&g_notify_mutex); 

     g_currenttrack= sp_link_as_track(sp_link_create_from_string(spotify:track:1NrJYpdAi7uosDRPmSYrsG)); 
     sp_track_add_ref(g_currenttrack); 

     if (sp_track_error(g_currenttrack) == SP_ERROR_OK) { 

       sp_session_player_load(g_sess, g_currenttrack); 
       sp_session_player_play(g_sess, 1); 
      } 
     do 
     { 
      sp_session_process_events(g_sess, &next_timeout); 
     } 
     while (next_timeout == 0); 

     pthread_mutex_lock(&g_notify_mutex); 
} 

나는 메인 루프에 의해 호출이 metadata_update을 찾았지만, 트랙을 만든 경우,이 루프 (290s에 대한) 오랫동안 교제 할 것이다.

+0

필요에 따라 이벤트 루프 호출 sp_session_process_events가 있습니까? – Weeble

+0

물론. 위의 모든 동작이 반복됩니다. 맞습니까? –

+0

맞아. sp_track에 대한 참조를 추가 한 후에도 sp_link를 릴리스 할 수는 있지만 릴리스해야한다고 생각합니다. 그러나 트랙 재생이 중단되어서는 안되며 리소스가 누출 될 수 있습니다. 4 단계를 따르기가 조금 어려웠습니다. 아마도 거기에 단어가 빠져있을 수 있습니까? 이 모든 일이 메인 루프와 관련하여 언제 발생하는지 명확히 할 수 있습니까? libspotify에서 콜백하는 동안이 함수를 호출합니까? 어떤 트랙 우르에서 작동하지만 다른 제품에서는 작동하지 않는다고 말하고 있습니까, 아니면 전혀 작동하지 않는다는 말입니까? – Weeble

답변

0

metadata_updatedsp_session_process_events()이 호출되지 않으면 호출되지 않습니다. 코드가 300 초 동안 멈추는 이유는 로그인 후 sp_session_process_events()이 다음 호출 시간 초과를 300 초로 설정하기 때문입니다. 3 단계가 끝나면 자신의 메인 스레드에 강제로 통지 할 수 있습니다. 그러면 문제가 해결됩니다. 불행히도 libspotify가이 시점에서 알림 메인 스레드를 보내지 않는 이유를 모르겠습니다. 우리 둘다 여기서 뭔가 빠진 것 같아.

관련 문제