vlc_mutex_t lock; /**< p_sys mutex */
vlc_cond_t wait; /**< song to submit event */
+ vlc_thread_t thread; /**< thread to submit song */
/* submission of played songs */
vlc_url_t p_submit_url; /**< where to submit data */
static int Open (vlc_object_t *);
static void Close (vlc_object_t *);
-static void Run (intf_thread_t *);
+static void *Run (void *);
/*****************************************************************************
* Module descriptor
vlc_mutex_init(&p_sys->lock);
vlc_cond_init(&p_sys->wait);
- var_AddCallback(pl_Get(p_intf), "item-current", ItemChange, p_intf);
+ if (vlc_clone(&p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW))
+ {
+ vlc_cond_destroy(&p_sys->wait);
+ vlc_mutex_destroy(&p_sys->lock);
+ free(p_sys);
+ return VLC_ENOMEM;
+ }
- p_intf->pf_run = Run;
+ var_AddCallback(pl_Get(p_intf), "activity", ItemChange, p_intf);
return VLC_SUCCESS;
}
intf_thread_t *p_intf = (intf_thread_t*) p_this;
intf_sys_t *p_sys = p_intf->p_sys;
- var_DelCallback(p_playlist, "item-current", ItemChange, p_intf);
+ var_DelCallback(p_playlist, "activity", ItemChange, p_intf);
+
+ vlc_cancel(p_sys->thread);
+ vlc_join(p_sys->thread, NULL);
p_input = playlist_CurrentInput(p_playlist);
if (p_input)
/*****************************************************************************
* Run : call Handshake() then submit songs
*****************************************************************************/
-static void Run(intf_thread_t *p_intf)
+static void *Run(void *data)
{
+ intf_thread_t *p_intf = data;
uint8_t p_buffer[1024];
int canc = vlc_savecancel();
bool b_handshaked = false;
/* data about audioscrobbler session */
- mtime_t next_exchange; /**< when can we send data */
+ mtime_t next_exchange = -1; /**< when can we send data */
unsigned int i_interval; /**< waiting interval (secs)*/
intf_sys_t *p_sys = p_intf->p_sys;
switch(Handshake(p_intf))
{
case VLC_ENOMEM:
- return;
+ goto out;
case VLC_ENOVAR:
/* username not set */
_("Last.fm username not set"),
"%s", _("Please set a username or disable the "
"audioscrobbler plugin, and restart VLC.\n"
- "Visit http://www.last.fm/join/ to get an account.")
- );
- return;
+ "Visit http://www.last.fm/join/ to get an account."));
+ goto out;
case VLC_SUCCESS:
- msg_Dbg(p_intf, "Handshake successfull :)");
+ msg_Dbg(p_intf, "Handshake successful :)");
b_handshaked = true;
i_interval = 0;
next_exchange = mdate();
case VLC_AUDIOSCROBBLER_EFATAL:
msg_Warn(p_intf, "Exiting...");
- return;
+ goto out;
case VLC_EGENERIC:
default:
msg_Dbg(p_intf, "Going to submit some data...");
char *psz_submit;
if (asprintf(&psz_submit, "s=%s", p_sys->psz_auth_token) == -1)
- return;
+ break;
/* forge the HTTP POST request */
vlc_mutex_lock(&p_sys->lock);
) == -1)
{ /* Out of memory */
vlc_mutex_unlock(&p_sys->lock);
- return;
+ goto out;
}
psz_submit_tmp = psz_submit;
if (asprintf(&psz_submit, "%s%s",
free(psz_submit_tmp);
free(psz_submit_song);
vlc_mutex_unlock(&p_sys->lock);
- return;
+ goto out;
}
free(psz_submit_song);
free(psz_submit_tmp);
HandleInterval(&next_exchange, &i_interval);
}
}
+out:
vlc_restorecancel(canc);
+ return NULL;
}