# include "config.h"
#endif
+#include <assert.h>
#include <time.h>
+#define VLC_MODULE_LICENSE VLC_LICENSE_GPL_2_PLUS
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_interface.h>
+#include <vlc_input.h>
#include <vlc_dialog.h>
#include <vlc_meta.h>
#include <vlc_md5.h>
audioscrobbler_song_t p_queue[QUEUE_MAX]; /**< songs not submitted yet*/
int i_songs; /**< number of songs */
+ input_thread_t *p_input; /**< current input thread */
vlc_mutex_t lock; /**< p_sys mutex */
vlc_cond_t wait; /**< song to submit event */
vlc_thread_t thread; /**< thread to submit song */
bool b_submit; /**< do we have to submit ? */
- bool b_state_cb; /**< if we registered the
- * "state" callback */
-
bool b_meta_read; /**< if we read the song's
* metadata already */
};
/*****************************************************************************
* ReadMetaData : Read meta data when parsed by vlc
*****************************************************************************/
-static void ReadMetaData(intf_thread_t *p_this)
+static void ReadMetaData(intf_thread_t *p_this, input_thread_t *p_input)
{
- input_thread_t *p_input;
- input_item_t *p_item;
+ intf_sys_t *p_sys = p_this->p_sys;
- intf_sys_t *p_sys = p_this->p_sys;
+ assert(p_input != NULL);
- p_input = playlist_CurrentInput(pl_Get(p_this));
- if (!p_input)
+ input_item_t *p_item = input_GetItem(p_input);
+ if (p_item == NULL)
return;
- p_item = input_GetItem(p_input);
- if (!p_item)
- {
- vlc_object_release(p_input);
- return;
- }
-
#define ALLOC_ITEM_META(a, b) do { \
char *psz_meta = input_item_Get##b(p_item); \
if (psz_meta && *psz_meta) \
end:
vlc_mutex_unlock(&p_sys->lock);
- vlc_object_release(p_input);
}
/*****************************************************************************
if (!p_sys->b_meta_read && state >= PLAYING_S)
{
- ReadMetaData(p_intf);
+ ReadMetaData(p_intf, p_input);
return VLC_SUCCESS;
}
static int ItemChange(vlc_object_t *p_this, const char *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data)
{
- input_thread_t *p_input;
- intf_thread_t *p_intf = (intf_thread_t*) p_data;
- intf_sys_t *p_sys = p_intf->p_sys;
- input_item_t *p_item;
+ intf_thread_t *p_intf = p_data;
+ intf_sys_t *p_sys = p_intf->p_sys;
+ input_thread_t *p_input = newval.p_address;
VLC_UNUSED(p_this); VLC_UNUSED(psz_var);
- VLC_UNUSED(oldval); VLC_UNUSED(newval);
+ VLC_UNUSED(oldval);
- p_sys->b_state_cb = false;
p_sys->b_meta_read = false;
p_sys->b_submit = false;
- p_input = playlist_CurrentInput(pl_Get(p_intf));
+ if (p_sys->p_input != NULL)
+ {
+ var_DelCallback(p_sys->p_input, "intf-event", PlayingChange, p_intf);
+ vlc_object_release(p_sys->p_input);
+ p_sys->p_input = NULL;
+ }
- if (!p_input || p_input->b_dead)
+ if (p_input == NULL)
return VLC_SUCCESS;
- p_item = input_GetItem(p_input);
- if (!p_item)
- {
- vlc_object_release(p_input);
+ input_item_t *p_item = input_GetItem(p_input);
+ if (p_item == NULL)
return VLC_SUCCESS;
- }
if (var_CountChoices(p_input, "video-es"))
{
msg_Dbg(p_this, "Not an audio-only input, not submitting");
- vlc_object_release(p_input);
return VLC_SUCCESS;
}
time(&p_sys->p_current_song.date); /* to be sent to last.fm */
p_sys->p_current_song.i_start = mdate(); /* only used locally */
+ p_sys->p_input = vlc_object_hold(p_input);
var_AddCallback(p_input, "intf-event", PlayingChange, p_intf);
- p_sys->b_state_cb = true;
if (input_item_IsPreparsed(p_item))
- ReadMetaData(p_intf);
+ ReadMetaData(p_intf, p_input);
/* if the input item was not preparsed, we'll do it in PlayingChange()
* callback, when "state" == PLAYING_S */
- vlc_object_release(p_input);
return VLC_SUCCESS;
}
return VLC_ENOMEM;
}
- var_AddCallback(pl_Get(p_intf), "activity", ItemChange, p_intf);
+ var_AddCallback(pl_Get(p_intf), "input-current", ItemChange, p_intf);
return VLC_SUCCESS;
}
*****************************************************************************/
static void Close(vlc_object_t *p_this)
{
- playlist_t *p_playlist = pl_Get(p_this);
- input_thread_t *p_input;
intf_thread_t *p_intf = (intf_thread_t*) p_this;
intf_sys_t *p_sys = p_intf->p_sys;
- 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)
+ var_DelCallback(pl_Get(p_intf), "input-current", ItemChange, p_intf);
+
+ if (p_sys->p_input != NULL)
{
- if (p_sys->b_state_cb)
- var_DelCallback(p_input, "intf-event", PlayingChange, p_intf);
- vlc_object_release(p_input);
+ var_DelCallback(p_sys->p_input, "intf-event", PlayingChange, p_intf);
+ vlc_object_release(p_sys->p_input);
}
int i;
intf_sys_t *p_sys = p_this->p_sys;
psz_username = var_InheritString(p_this, "lastfm-username");
- if (!psz_username)
- return VLC_ENOMEM;
-
psz_password = var_InheritString(p_this, "lastfm-password");
- if (!psz_password)
- {
- free(psz_username);
- return VLC_ENOMEM;
- }
/* username or password have not been setup */
- if (!*psz_username || !*psz_password)
+ if (EMPTY_STR(psz_username) || EMPTY_STR(psz_password))
{
free(psz_username);
free(psz_password);
psz_scrobbler_url = var_InheritString(p_this, "scrobbler-url");
if (!psz_scrobbler_url)
{
+ free(psz_auth_token);
free(psz_username);
return VLC_ENOMEM;
}
"http://%s/?hs=true&p=1.2&c="CLIENT_NAME"&v="CLIENT_VERSION"&u=%s&t=%s&a=%s"
, psz_scrobbler_url, psz_username, psz_timestamp, psz_auth_token);
+ free(psz_auth_token);
free(psz_scrobbler_url);
free(psz_username);
if (i_ret == -1)
/* data about audioscrobbler session */
mtime_t next_exchange = -1; /**< when can we send data */
- unsigned int i_interval; /**< waiting interval (secs)*/
+ unsigned int i_interval = 0; /**< waiting interval (secs)*/
intf_sys_t *p_sys = p_intf->p_sys;