2

Windowsでlibspotify 12.1.51を使用しています。ほとんどが期待どおりに機能しますが、次の点で問題がありsp_offline_sync_statusます。

typedef struct sp_offline_sync_status {
  int queued_tracks;
  sp_uint64 queued_bytes;

  int done_tracks;
  sp_uint64 done_bytes;

  int copied_tracks;
  sp_uint64 copied_bytes;

  int willnotcopy_tracks;

  int error_tracks;
  bool syncing;

} sp_offline_sync_status;

( sp_uint64Windows では unsigned __int64 の typedef であり、それ以外の場合は uint64_t です。C (C++ ではない) でビルドする場合、および bool が定義されていない場合は、unsigned char の typedef です。)

を呼び出すとsp_offline_sync_get_status、正しいデータしかないqueued_tracksようで、残りはゴミです。ただし、ヘッダー ファイルを編集して を含める#pragma pack(1)と、より妥当な結果が得られるようです。spshelllibspotify に付属のサンプルをビルドしようとしても、この動作を観察します。

これにより、少なくとも Visual C++ を使用する Windows では、libspotify バイナリがデフォルトとは異なるコンパイラ フラグでコンパイルされていると思われます。libspotify を使用するには、C または C++ コードをどのようにコンパイルすればよいですか? それとも、#include api.h の前に #pragma pack を使用してから元に戻す必要がありますか? libspotify の将来のバージョンでこれが安定していると期待できますか、それとも変更される可能性がありますか? プラットフォーム間でどのように異なりますか?

私の本当の目標は、Mono を使用してさまざまなプラットフォームで動作する C# P/Invoke コードを作成することです。Windows 以外のプラットフォームでは、libspotify はネイティブ コンパイラのデフォルトのアラインメントに固執しますか? それとも、各プラットフォームでカスタム アラインメントを指定する必要がありますか?

[*] - ただし、最初に他のバグを修正する必要がありました。libspotify 12.1.51 で提供されているように、Windows では、spshell は制御キーの押下 (Shift、Ctrl など) を NUL 文字の入力として登録します。これにより、Spotify URI をコンソールに入力したり貼り付けたりすることができなくなります。これは、spshell_win32.c を編集case 0: break;して の switch ステートメントに追加することで修正できますconsole_input。また、関数内の spshell.c の文字列書式指定子 "%zd" を使用しますoffline_status_updated。Microsoft C ランタイムはこれを処理しないようです。そのため、変更する必要があります (たとえば、Windows でのみ動作させたい場合は "%Iu" に変更するか、プラットフォームに依存するマクロに変更します)。

4

1 に答える 1

3

libspotify は「-Zp4」でコンパイルされていますが、標準は「-Zp8」のようです。そのフラグを使用してコンパイルするか、 #pragma pack(4) ディレクティブを使用できると思います(実際には、質問で使用したように、1よりも4の方が正しいと思います)

ご指摘のspshell.cのエラーを修正するためにJiraにメモを入れます。ありがとう!

于 2013-01-11T10:58:15.880 に答える