1

libspotify ライブラリ (Linux 用のバージョン 12.1.51 x86) をテストしていましたが、セグメンテーション エラーで sp_session_create() を呼び出すとアプリケーションがクラッシュし続けます。

アプリケーション キーも Premium Spotify アカウントも (まだ) 持っていませんが、それがクラッシュの原因ではないはずです。私の記憶が正しければ、無効なアプリケーション キーのエラー コードがあるからです。

私のコードは次のとおりです。

static uint_8_t g_appkey[] = {1, 2, 3};
static const char *username = "MyUsername";
static const char *password = "MyPassword";
static int logged_in;

static sp_session_callbacks session_callbacks;
static sp_session_config spconfig;

static void on_login(sp_session *session, sp_error error) {
    printf("Callback: on_login");
    if (error != SP_ERROR_OK) {
        printf("Error: Unable to login: %d\n", (int) error);
        exit(-1);
    }
    logged_in = 1;
}

static void on_main_thread_notified(sp_session *session) {
    printf("callback: on_main_thread_notified");
}

static void on_log_message(sp_session *session, const char *data) {
    printf("callback: on_log_message");
}

int main(int argc, char **argv) {
    sp_error error;
    sp_session *session;
    int next_timeout;

    /* struct fill */
    memset(&session_callbacks, 0, sizeof(session_callbacks));
    memset(&spconfig, 0, sizeof(spconfig)); 

    session_callbacks.logged_in          = &on_login;
    session_callbacks.notify_main_thread = &on_main_thread_notified;
    session_callbacks.log_message        = &on_log_message; 

    spconfig.api_version          = SPOTIFY_API_VERSION;
    spconfig.cache_location       = "tmp";
    spconfig.settings_location    = "tmp";
    spconfig.application_key      = g_appkey;
    spconfig.application_key_size = sizeof(g_appkey);
    spconfig.user_agent           = "spot";
    spconfig.callbacks            = &session_callbacks;

    /* session creation */  
    error = sp_session_create(&spconfig, &session);
    if (error != SP_ERROR_OK) {
        printf("ERROR: Unable to create spotify session: %s\n", sp_error_message(error));
        exit(-1);
    }

    /* log in */
    logged_in = 0;
    sp_session_login(session, username, password, 0, NULL);
    while(!logged_in) {
        sp_session_process_events(session, &next_timeout);
        sleep(next_timeout);
    }

    printf("Sucess!!");
    exit(0);
}

どこに問題がある可能性があるかについてのヒントはありますか?

与えられた助けに感謝します。


gdb からのバックトレース:

[Thread debugging using libthread_db enabled]
[New Thread 0xb7fe6b70 (LWP 1839)]
[New Thread 0xb7f65b70 (LWP 1840)]

Program received signal SIGSEGV, Segmentation fault.
0x002b9b36 in sp_session_create () from /usr/local/lib/libspotify.so.12
(gdb) thread apply all backtrace

Thread 3 (Thread 0xb7f65b70 (LWP 1840)):
#0  0x0012d422 in __kernel_vsyscall ()
#1  0x003e6ce6 in nanosleep () at ../sysdeps/unix/syscall-template.S:82
#2  0x0041644c in usleep (useconds=10000) at ../sysdeps/unix/sysv/linux/usleep.c:33
#3  0x00293581 in ?? () from /usr/local/lib/libspotify.so.12
#4  0x00293990 in ?? () from /usr/local/lib/libspotify.so.12
#5  0x001d42b7 in ?? () from /usr/local/lib/libspotify.so.12
#6  0x004ae96e in start_thread (arg=0xb7f65b70) at pthread_create.c:300
#7  0x0041ca4e in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:130

Thread 2 (Thread 0xb7fe6b70 (LWP 1839)):
#0  0x0012d422 in __kernel_vsyscall ()
#1  0x004b5245 in sem_wait@@GLIBC_2.1 () at ../nptl/sysdeps/unix/sysv/linux/i386/i686/../i486/sem_wait.S:80
#2  0x002178fa in ?? () from /usr/local/lib/libspotify.so.12
#3  0x001d42b7 in ?? () from /usr/local/lib/libspotify.so.12
#4  0x004ae96e in start_thread (arg=0xb7fe6b70) at pthread_create.c:300
#5  0x0041ca4e in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:130

Thread 1 (Thread 0xb7fe78d0 (LWP 1836)):
#0  0x002b9b36 in sp_session_create () from /usr/local/lib/libspotify.so.12
#1  0x080487d5 in main ()
(gdb) 
4

4 に答える 4

0

このコードを取得し、libspotify-12 に対してビルドしたところ、アプリ ID に関する予想されるエラーで実行されました。

libspotify/examples/jukebox$ make
cc -I/usr/include/alsa   -I/home/nik/Code/spotify/libspotify/targets/Linux-x86_64-release/include -Wall   -Wl,-rpath,/home/nik/Code/spotify/libspotify/targets/Linux-x86_64-release/lib -L/home/nik/Code/spotify/libspotify/targets/Linux-x86_64-release/lib jukebox.o appkey.o alsa-audio.o audio.o -o jukebox -lasound   -lpthread -lspotify
libspotify/examples/jukebox$ ./jukebox
ERROR: Unable to create spotify session: Invalid application key

起動して実行するのに問題がある場合は、libspotify に同梱されているサンプル コード、具体的にはjukebox例を参照することをお勧めします。上記のシェルの例ではjukebox.c、コードを置き換えただけで、問題なくビルドできました。

libspotify の新しいバージョンで修正されたバグがここにある可能性があります (免責事項: 私は Spotify で働いており、実際に上記の例を最新の 12.x コードでコンパイルしましたが、これには未リリースのバグ修正が含まれている可能性があります)。ただし、コード自体は異常なことをしているようには見えませんが、問題がある場合は、目的に合わせて調整jukebox.cすることをお勧めします。

于 2013-08-29T15:09:38.863 に答える
0

偽のアプリ キーは非常に短いです。有効なアプリ キーを見ると、長さは 321 バイトで、最初の 2 バイトはビッグ エンディアン番号 322 です。おそらく、最初の 2 バイトは libspotify に、保存するために割り当てる必要があるヌル終了文字列の大きさを伝えていると思います。キー全体。libspotify が application_key_size の代わりにそれを信頼する場合、それがエラーを返す代わりにクラッシュする理由である可能性があります。

于 2013-08-29T10:21:41.813 に答える
0

ストレージ クラスを持つ変数はstatic無効にする必要はありません。デフォルトでは無効になっています。

/* struct fill */
memset(&session_callbacks, 0, sizeof(session_callbacks));
memset(&spconfig, 0, sizeof(spconfig));

これらのフォルダが実際に存在することを確認してください

編集:実際にはライブラリcache_locationによって作成される必要があります。

spconfig.cache_location       = "tmp";
spconfig.settings_location    = "tmp";

完全な例については、次を参照してください。

http://damienradtke.org/playing-with-the-spotify-api/

于 2013-08-28T15:48:06.167 に答える