Странности при переключении трека

Список разделов foobar2000 Плагины SDK

Описание: Разработка плагинов для foobar2000 с использованием SDK.

Сообщение #1 stedy » 27.08.2007, 10:37

Добрый день! Пишу плагин для оповещения квипа о текущем проигрываемом треке.
Рабочий вариант уже наваял, но есть некоторые вопросы.

Так, если переключение происходит при нажатии либо горячих еклавиш, либо при нажатии клавишей мышки в плейлисте - Всё нормально переключается. Но вот если переключение идёт после того как один трек закончился и начинается следующий - информация в КВИП не посылается. Кто что может сказать?

Привожу куски кода:

Код: Выделить всё
class play_callback_qip : public play_callback_static
{
   virtual void on_playback_starting(play_control::t_track_command p_command, bool p_paused) {}
   virtual void on_playback_new_track(metadb_handle_ptr p_track)
   {
      DoStatus(p_track);
   }
   virtual void on_playback_stop(play_control::t_stop_reason p_reason)
   {
      DoEmptyStatus();
   }
   virtual void on_playback_seek(double p_time) {}
   virtual void on_playback_pause(bool p_state)
   {
      if (!p_state)
      {
         metadb_handle_ptr track;
         static_api_ptr_t<play_control>()->get_now_playing(track);
         if (track.is_valid())
         {
            DoStatus(track);
            track.release();
         }
      }
   }
   virtual void on_playback_edited(metadb_handle_ptr p_track) {}
   virtual void on_playback_dynamic_info(const file_info & info) {}
   virtual void on_playback_dynamic_info_track(const file_info & info) {}
   virtual void on_playback_time(double p_time) {}
   virtual void on_volume_change(float p_new_val) {};
   
   virtual unsigned get_flags()
   {
      return flag_on_playback_new_track | flag_on_playback_pause | flag_on_playback_stop;
   }
};



Код: Выделить всё
// Получим-ка информацию о треке
   pfc::string8 text;
   try
   {
      static_api_ptr_t<play_control> pc;
      service_ptr_t<titleformat_object> script;
      if (static_api_ptr_t<titleformat_compiler>()->compile (script, cfg_tformat.get_ptr()))
      {
         if (pc->get_now_playing(track))
         {
            pc->playback_format_title_ex(track, NULL, text, script, NULL, play_control::display_level_titles);
         }
      }
   }
   catch (const std::exception & exc) {
      console::formatter() << "Exception occurred while getting the title:\n" << exc;
   }

   // Перекодируем название трека
   pfc::stringcvt::string_wide_from_utf8 textw(text);
stedy
Автор темы
Репутация: 0
С нами: 16 лет 8 месяцев

Сообщение #2 stedy » 27.08.2007, 11:44

Решил!

Проблема вообще была с квипом - висела в памяти копия квипа, в которую и отправлялась инфа :)
stedy
Автор темы
Репутация: 0
С нами: 16 лет 8 месяцев

Сообщение #3 skipyrich » 27.08.2007, 13:02

stedy:Решил!
Радует  :)
А еще, для полного понимания процесса можно включить в отладочном билде все события в play_callback и в обработчиках сделать информационный вывод в консоль, например:
Код: Выделить всё
virtual void on_playback_pause(bool p_state){
#ifdef _DEBUG
    pfc::string8 msg("on_playback_pause: p_state=");
    msg.add_string(p_state?"true":"false");
    console::info(msg);
#endif // _DEBUG
}
virtual unsigned get_flags(){
    return flag_on_playback_new_track | flag_on_playback_pause | flag_on_playback_stop
#ifdef _DEBUG
        | flag_on_playback_all
#endif // _DEBUG
        ;
}
skipyrich M
Откуда: Москва
Репутация: 11
С нами: 17 лет 10 месяцев

Сообщение #4 stedy » 27.08.2007, 13:32

Спасибо большое за информацию! Обязательно приму к сведению
stedy
Автор темы
Репутация: 0
С нами: 16 лет 8 месяцев


Вернуться в SDK