Blog. Just Blog

Как получить название текущего трека из JetAudio

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как получить название текущего трека из JetAudio
Как получить название текущего трека из JetAudio

Если перечислять популярные медиаплееры, то не последнее место в этом списке занимает JetAudio. При разработке своей программы My Music Web Agent я решил добавить в нее возможность получать информацию о воспроизводимом треке и для JetAudio. Можно было пойти по наиболее простому пути: поиск окна проигрывателя, поиск его дочерних элементов, где отображается наименование трека, и так далее. Но у JetAudio, в зависимости от настроек, может быть одновременно большое количество окон. Более того, нет неизменного класса или заголовка окна, эти значения меняются от версии к версии. В итоге я решил обратиться к официальной документации для разработчиков, которая, как ни странно, оказалась весьма подробной.

Итак, получение информации из JetAudio сводится к следующим действиям. Сперва надо найти управляющее окно плеера, оно находится по имени класса "COWON Jet-Audio Remocon Class" и заголовку "Jet-Audio Remote Control", хотя на практике вполне достаточно какого-нибудь одного параметра. Затем этому окну отправляются сообщения нескольких типов: управление состоянием плеера и запросы каких-либо параметров. Нас интересует только получение статуса плеера и названия текущего трека. Сперва надо описать несколько констант, которые используются в коде:
  1. WM_APP = 0x8000
  2. WM_REMOCON_GETSTATUS    = WM_APP+740
  3. GET_STATUS_STATUS       = 1
  4. MCI_MODE_PLAY = 526
  5.  
  6. GET_STATUS_TRACK_TITLE  = 12
  7. GET_STATUS_TRACK_ARTIST = 13
  8. JRC_COPYDATA_ID_TRACK_TITLE  = 0x3001
  9. JRC_COPYDATA_ID_TRACK_ARTIST = 0x3002
Константы для управления или для получения других параметров вы можете посмотреть в файле JetAudio6_API.h, который находится в архиве с SDK.

Начнем с получения информации о состоянии плеера. Название трека будем получать только тогда, когда он реально воспроизводится и, конечно же, если JetAudio вообще запущен. Тут ничего сложного, находим окно, запрашиваем статус:
  1. ; Название класса управляющего окна
  2. wc1      db      'COWON Jet-Audio Remocon Class',0
  3. ...
  4.  
  5.         ; Получить хэндл управляющего окна JetAudio
  6.         invoke  FindWindow,wc1,0
  7.         or      eax,eax
  8.         ; JetAudio не запущен
  9.         jz      .no_jetaudio
  10.  
  11.         ; Сохранить хэндл окна
  12.         mov     ebx,eax
  13.  
  14.         ; Плеер активен?
  15.         invoke  SendMessage,ebx,WM_REMOCON_GETSTATUS,0,GET_STATUS_STATUS
  16.         cmp     eax,MCI_MODE_PLAY
  17.         ; Плеер должен быть в состоянии "Воспроизведение"
  18.         jne     .no_jetaudio
  19.  
  20.         ; Музыка играет, можно запрашивать название трека
С получением текстовой информации, такой как интересующее нас название трека, ситуация посложнее. Наше приложение должно отправить сообщение управляющему окну JetAudio, в котором указывается тип запрашиваемых данных и хэндл окна нашего приложения. Этому callback-окну из JetAudio будут переданы данные через ответное сообщение WM_COPYDATA. Получается, что обмен данными между нашим приложением и JetAudio выполняется в асинхронном режиме, обязательно учитывайте эту особенность при программировании. При этом отдельно запрашивается название исполнителя и отдельно - название трека.
  1.         ; Отправить сообщения управляющему окну JetAudio
  2.         invoke  SendMessage,ebx,WM_REMOCON_GETSTATUS,[hwnddlg],\
  3.                 GET_STATUS_TRACK_ARTIST
  4.         invoke  SendMessage,ebx,WM_REMOCON_GETSTATUS,[hwnddlg],\
  5.                 GET_STATUS_TRACK_TITLE
В обработчике окна отслеживаем сообщение WM_COPYDATA. В lParam передается указатель на структуру COPYDATASTRUCT, которая содержит все интересующие нас данные.
  1.         ; Сообщение от окна JetAudio
  2.         cmp     [msg],WM_COPYDATA
  3.         je      .wmcopy
  4.         ...
  5.  
  6. .wmcopy:
  7.         ; Обработка сообщений от JetAudio
  8.         mov     eax,[lparam]
  9.  
  10.         ; Это события от JetAudio?
  11.         cmp     [eax+COPYDATASTRUCT.dwData],JRC_COPYDATA_ID_TRACK_ARTIST
  12.         je      .copy_artist
  13.         cmp     [eax+COPYDATASTRUCT.dwData],JRC_COPYDATA_ID_TRACK_TITLE
  14.         je      .copy_title
  15.         ...
  16.  
  17. ; Обработка названия исполнителя
  18. .copy_artist:
  19.         ; Проверить длину строки
  20.         cmp     [eax+COPYDATASTRUCT.cbData],0
  21.         je      @f
  22.  
  23.         ; Строка названия исполнителя в [eax+COPYDATASTRUCT.lpData]
  24.         ...
  25. @@:
  26.         ...
  27.  
  28. ; Обработка названия трека
  29. .copy_title:
  30.         ; Проверить длину строки
  31.         cmp     [eax+COPYDATASTRUCT.cbData],0
  32.         je      @f
  33.  
  34.         ; Строка названия трека в [eax+COPYDATASTRUCT.lpData]
  35.         ...
  36. @@:
  37.         ...
Также обратите внимание, что при обработке WM_COPYDATA надо обязательно проверять параметр COPYDATASTRUCT.dwData, чтобы обрабатывать только сообщения, поступающие от JetAudio.

В приложении пример программы с исходным текстом, получающей название исполнителя и трека, который сейчас воспроизводится в JetAudio.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Get.JetAudio.Track.Demo.zip (2,704 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 2838 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0034 сек.) / Память: 4.5 Mb
Наверх