gpt4 book ai didi

c++ - Libspotify 简单的 Hello World

转载 作者:行者123 更新时间:2023-11-28 07:30:40 24 4
gpt4 key购买 nike

我最近开始使用 libspotify,并基于 jukebox.h 的示例代码编写了一个简单的 hello world。

我的代码目前看起来像这样:

#include <stdio.h>
#include "libspotify/api.h"
#include "Key.h"
#include "Password.h"
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

#define true 1
#define false 0

sp_session *g_session;
bool g_notify_do;
static pthread_mutex_t g_notify_mutex;
static pthread_cond_t g_notify_cond;

#define DEBUG 1

__stdcall static void debug(const char *format, ...) {
if (!DEBUG)
return;

va_list argptr;
va_start(argptr, format);
vprintf(format, argptr);
printf("\n");
}

void assertSpotify(sp_error error, char *details) {
if (error != SP_ERROR_OK) {
debug("Fatal error: %s", details);
exit(1);
}
}

__stdcall static void notify_main_thread(sp_session *sess) {
pthread_mutex_lock(&g_notify_mutex);
g_notify_do = 1;
pthread_cond_signal(&g_notify_cond);
pthread_mutex_unlock(&g_notify_mutex);
}

__stdcall static void logged_in(sp_session *sess, sp_error error) {
assertSpotify(error, "Could not log in.");

sp_playlistcontainer *pc = sp_session_playlistcontainer(sess);
printf("Looking at %d playlists\n", sp_playlistcontainer_num_playlists(pc));
}

int main(void) {
sp_error err;
static sp_session_callbacks session_callbacks = {};
static sp_session_config spconfig = {};
int next_timeout = 0;

printf("Starting up...\n");
session_callbacks.notify_main_thread = &notify_main_thread;
session_callbacks.logged_in = &logged_in;

spconfig.api_version = SPOTIFY_API_VERSION;
spconfig.cache_location = "tmp";
spconfig.settings_location = "tmp";
spconfig.application_key = g_appkey;
spconfig.application_key_size = g_appkey_size;
spconfig.user_agent = "Hello-World";
spconfig.callbacks = &session_callbacks;

pthread_mutex_init(&g_notify_mutex, NULL);
pthread_cond_init(&g_notify_cond, NULL);

err = sp_session_create(&spconfig, &g_session);
assertSpotify(err, "Could not create Spotify Session.");
debug("Session created.");

err = sp_session_login(g_session, spotify_user, spotify_pw, 0, NULL); //Defined in Password.h
assertSpotify(err, "Could not log in.");
debug("Username: %s", sp_session_user_name(g_session));
err = sp_session_set_connection_type(g_session, SP_CONNECTION_TYPE_WIRED );
assertSpotify(err, "Could not set connection type.");
pthread_mutex_lock(&g_notify_mutex);

while (true) {
if (next_timeout == 0) {
while(!g_notify_do)
pthread_cond_wait(&g_notify_cond, &g_notify_mutex);
} else {
time_t now = time(NULL);
struct timespec ts;
ts.tv_sec = now;
ts.tv_sec = now / 1000000;
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 = false;
pthread_mutex_unlock(&g_notify_mutex);
do {
sp_session_process_events(g_session, &next_timeout);
} while (next_timeout == 0);
pthread_mutex_lock(&g_notify_mutex);
}

return 0;
}

问题是,即使我的帐户有大约 10 个播放列表,sp_playlistcontainer_num_playlists 也会返回 0

我的系统:带有 MinGW 的 Windows 7 x64。

我做错了什么?

最佳答案

查看 jukebox.c 的来源在尝试查询播放列表之前,您似乎应该确保播放列表容器已完全加载。因此,如果我理解正确,您应该为 container_loaded 添加一个回调。
我还认为您应该设置一个回调,以便在用户登录时收到通知,并且在登录后您应该尝试获取播放列表容器。这样的事情可能会有所帮助:

static sp_playlistcontainer_callbacks pc_callbacks = {
NULL, /* playlist_added */
NULL, /* playlist_removed */
NULL, /* playlist_moved */
&container_loaded,
};
static sp_session_callbacks session_callbacks = {
&logged_in,
&notify_main_thread,
NULL, /* music_delivery */
NULL, /* metadata_updated */
NULL, /* play_token_lost */
NULL, /* log_message */
NULL /* end_of_track */
};
static void container_loaded(sp_playlistcontainer *pc, void *userdata)
{
// container is fully loaded now it should be safe to query the container
int num_playlists = sp_playlistcontainer_num_playlists(pc);
}
static void logged_in(sp_session *sess, sp_error error)
{
// get playlist when user is logged in
sp_playlistcontainer *pc = sp_session_playlistcontainer(sess);

// add callbacks
sp_playlistcontainer_add_callbacks(
pc,
&pc_callbacks,
NULL);
/* rest of code */
}

关于c++ - Libspotify 简单的 Hello World ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17798160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com