libspotify:What can I and can';我不能使用图像ID吗?
各种libspotify API函数处理图像ID: 它们都以常量字节的形式返回图像ID*:libspotify:What can I and can';我不能使用图像ID吗?,spotify,libspotify,Spotify,Libspotify,各种libspotify API函数处理图像ID: 它们都以常量字节的形式返回图像ID*: sp_album_cover sp_artist_portrait sp_artistbrowse_portrait sp_image_image_id sp\u image\u create将图像ID参数作为const byte[20],而sp\u playlist\u get\u image将图像ID参数作为byte[20]并用图像ID值填充 在这个问题中,Spotify的一名员工表示,图像ID的内
sp_album_cover
sp_artist_portrait
sp_artistbrowse_portrait
sp_image_image_id
sp\u image\u create
将图像ID参数作为const byte[20]
,而sp\u playlist\u get\u image
将图像ID参数作为byte[20]
并用图像ID值填充
在这个问题中,Spotify的一名员工表示,图像ID的内容不透明,20的大小不一定是图像ID的准确长度:
sp_image_create采用20字节长的image_id参数。这是否意味着图像id的最大长度为20字节
不,sp_订户是我们为编译器输入假数字的另一个例子。图像id指针的内容不透明,可能会在不同版本之间更改。不要编写对它们做出假设的代码,因为这样会破坏它们
但是,为了使用sp_playlist_get_image,调用者需要分配数组来存储图像ID。这似乎是不一致的建议,或者至少令人惊讶。以下哪项是正确的
- 解释A:图像ID始终正好是20个字节
- 解释B:图像ID的长度可能不超过20字节
- 解释C:图像ID可以是任意长度,但是
返回的图像ID保证不超过20字节sp\u playlist\u get\u Image
- 解释D:图像ID可以是任意长度,并且
根本无法安全使用sp\u playlist\u get\u Image
我之所以感兴趣,是因为我试图编写一个比现有的更安全、更高级的.NET包装器,而且我不确定如何在托管代码中显示图像ID。我认为它的唯一用途是有两种替代实现—一种是20字节的缓冲区,表示从
sp_playlist\u get_image
返回的图像ID,另一种是IntPtr,表示从其他任何东西返回的图像ID。如果库对图像ID的大小和性质做出了足够的保证,我可以随时使用自己的缓冲区,并在必要时复制到其中,但我担心libspotify不太可能做出足够强的保证来实现这一点。对于当前版本的libspotify,解释C对于该特定调用是正确的。由于它需要字节[20],因此该函数保证如果分配20个字节,您将始终有足够的空间容纳播放列表的图像ID。如果这保证了将来的更改,则函数签名将被更改,前提是我们尚未使其与其他所有功能一样工作
考虑到API的状态,您的混合解决方案现在听起来是最好的。使用IntPtr
,当讨厌的sp_playlist_get_image
消失后,您将可以更好地应对未来
我希望你的项目进展顺利-我们一直希望有一个像样的.NET包装多年,但从来没有时间做整个事情自己。如果它是开源的,我很乐意贡献 其目的是开放源代码。我希望在下个月左右把它放到github上。当我这样做的时候,它会在某个地方。前面提到的C#包装器库现在在这里:你有播放列表的imageID吗?我将其与Byte[]类型一起用于互操作调用,我传入的缓冲区似乎从未被libspotfiy..EDIT填充或更改。似乎我必须传入一个IntPtr,指向Marshal.AllocHGlobal函数分配的缓冲区。