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_uint64
Windows では unsigned __int64 の typedef であり、それ以外の場合は uint64_t です。C (C++ ではない) でビルドする場合、および bool が定義されていない場合は、unsigned char の typedef です。)
を呼び出すとsp_offline_sync_get_status
、正しいデータしかないqueued_tracks
ようで、残りはゴミです。ただし、ヘッダー ファイルを編集して を含める#pragma pack(1)
と、より妥当な結果が得られるようです。spshell
libspotify に付属のサンプルをビルドしようとしても、この動作を観察します。
これにより、少なくとも 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" に変更するか、プラットフォームに依存するマクロに変更します)。