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_uint64在 Windows 上是 unsigned __int64 的 typedef,否则是 uint64_t。在 C(不是 C++)中构建时,如果 bool 没有另外定义,它是 unsigned char 的 typedef。)

当我打电话时sp_offline_sync_get_statusqueued_tracks似乎只有正确的数据,其余的都是垃圾。但是,如果我将头文件编辑为包含#pragma pack(1),它似乎会给出更合理的结果。即使我尝试构建spshelllibspotify 附带的示例,我也会观察到这种行为。*

这使我相信 libspotify 二进制文件是使用一些与默认值不同的编译器标志编译的,至少在使用 Visual C++ 的 Windows 上是这样。我应该如何编译 C 或 C++ 代码以使用 libspotify?或者我应该在#include api.h 之前使用#pragma pack 然后恢复它?我可以期望这在未来版本的 libspotify 中保持稳定还是可能会改变?它在不同平台上有何不同?

我的真正目标是编写 C# P/Invoke 代码,该代码可在各种使用 Mono 的平台上运行。在非 Windows 平台上,libspotify 是否坚持本机编译器的默认对齐方式,还是我需要在每个平台上指定自定义对齐方式?

[*] - 不过,我确实必须先修复一些其他错误。正如 libspotify 12.1.51 中所提供的,在 Windows 上,spshell 将控制按键(例如 shift、ctrl)注册为输入 NUL 字符。这可以防止在控制台中键入或粘贴 spotify URI。这可以通过编辑 spshell_win32.c 添加case 0: break;console_input. 此外,它在函数的 spshell.c 中使用字符串格式说明符“%zd” offline_status_updated。Microsoft C 运行时似乎无法处理此问题,因此需要对其进行更改(例如,如果您只希望它在 Windows 上工作,则更改为“%Iu”,或者更改为平台敏感的宏)。

4

1 回答 1

3

libspotify 使用“-Zp4”编译,而标准似乎是“-Zp8”。我想可以使用该标志进行编译,或者使用 #pragma pack(4) 指令(我实际上认为 4 比 1 更正确,正如您在问题中使用的那样)

将在 Jira 中添加注释以修复您指出的 spshell.c 中的错误。谢谢!

于 2013-01-11T10:58:15.880 回答