这是为了回应dan(在IRC上发布的^ ^ spotify)提供看看我的测试用例,但我在这里发布以防万一有人遇到类似的问题。
我遇到了libspotify的问题,在这两种情况下,应用程序崩溃(内存访问冲突):
我已经从会话回调中应用了足够的同步,而我正在单个线程上运行。
我做了一个小测试用例,它执行以下操作:
我为测试用例做了一个要点。可在此处找到:https://gist.github.com/4496396
测试用例是使用Qt(我正在为我的项目使用),所以你需要Qt 5来编译它。我也只是用Windows和Linux编写它(没有Mac)。假设您安装了Qt 5和Qt Creator,说明如下:
如果有人能告诉我自己做错了什么,我会非常感激,因为我花了这么多时间尝试任何我能想到的事情,或者只是盯着它,我担心自己已经失明了我现在的错误。
我在Windows 7和Linux Ubuntu 12.10上都测试了它,我发现行为有所不同:
另外,我可以报告sp_session_flush_caches()不导致崩溃。
编辑:另外,IRC上的hugo___非常友好,可以在OSX上测试它。尽管连续多次运行该应用程序,但他没有报告崩溃。答案 0 :(得分:1)
虽然你很可能正在查看libspotify中的一个错误,但我想指出对sp_session_process_events()
的一个可能多余的调用,这是从我查看你的代码时收集到的。
void SessionTest::processSpotifyEvents()
{
if (m_session == 0)
{
qDebug() << "Process: No session.";
return;
}
int interval = 0;
sp_session_process_events(m_session, &interval);
qDebug() << interval;
m_timerId = startTimer(interval);
}
似乎此代码将获取interval
值并在其上启动计时器以触发对event()
的后续调用。但是,当interval为0时,此代码也将调用startTimer
,这绝对不是必需的,或者更确切地说意味着应用程序可以继续执行其他操作,直到获得notify_main_thread
回调。 startTimer
上的文档说“如果interval为0,那么每当没有更多的窗口系统事件要处理时,定时器事件就会发生一次。”我不确定这究竟意味着什么,但似乎它可以产生至少一个sp_session_process_events()
的冗余调用。
答案 1 :(得分:1)
我注意到,如果您在调用时播放曲目,则会在sp_session_release上崩溃。
答案 2 :(得分:0)
我今天一直在追逐这个问题。登录/注销在Mac上运行正常,但问题是100%可重复的,如您在Windows上所述。
通过注册offline_status_updated
和credentials_blob_updated
的空回调,崩溃就消失了。这是一个非常令人不满意的解决方案,我想知道是否有任何 libspotify 开发人员想对它发表评论。
我的应用中注册的回调是:
logged_in
logged_out
notify_main_thread
log_message
offline_status_updated
credentials_blob_updated
我应该明确指出我在你提供的代码上做了不尝试这个。知道添加这两个额外的回调是否适合您将会很有趣。请注意,我提供的功能绝对没有。他们只需要在那里并在创建会话时进行注册。
答案 3 :(得分:0)
在&#34;登录&#34;中添加以下呼叫libspotify回调似乎可以修复此崩溃as detailed in this SO post:
sp_session_playlistcontainer(session);