Как получить название текущего трека из JetAudio
Как получить название текущего трека из JetAudio
Если перечислять популярные медиаплееры, то не последнее место в этом списке занимает JetAudio. При разработке своей программы My Music Web Agent я решил добавить в нее возможность получать информацию о воспроизводимом треке и для JetAudio. Можно было пойти по наиболее простому пути: поиск окна проигрывателя, поиск его дочерних элементов, где отображается наименование трека, и так далее. Но у JetAudio, в зависимости от настроек, может быть одновременно большое количество окон. Более того, нет неизменного класса или заголовка окна, эти значения меняются от версии к версии. В итоге я решил обратиться к официальной документации для разработчиков, которая, как ни странно, оказалась весьма подробной.
Итак, получение информации из JetAudio сводится к следующим действиям. Сперва надо найти управляющее окно плеера, оно находится по имени класса "COWON Jet-Audio Remocon Class" и заголовку "Jet-Audio Remote Control", хотя на практике вполне достаточно какого-нибудь одного параметра. Затем этому окну отправляются сообщения нескольких типов: управление состоянием плеера и запросы каких-либо параметров. Нас интересует только получение статуса плеера и названия текущего трека. Сперва надо описать несколько констант, которые используются в коде:
Code (Assembler) : Убрать нумерацию
- WM_APP = 0x8000
- WM_REMOCON_GETSTATUS = WM_APP+740
- GET_STATUS_STATUS = 1
- MCI_MODE_PLAY = 526
- GET_STATUS_TRACK_TITLE = 12
- GET_STATUS_TRACK_ARTIST = 13
- JRC_COPYDATA_ID_TRACK_TITLE = 0x3001
- JRC_COPYDATA_ID_TRACK_ARTIST = 0x3002
Начнем с получения информации о состоянии плеера. Название трека будем получать только тогда, когда он реально воспроизводится и, конечно же, если JetAudio вообще запущен. Тут ничего сложного, находим окно, запрашиваем статус:
Code (Assembler) : Убрать нумерацию
- ; Название класса управляющего окна
- wc1 db 'COWON Jet-Audio Remocon Class',0
- ...
- ; Получить хэндл управляющего окна JetAudio
- invoke FindWindow,wc1,0
- or eax,eax
- ; JetAudio не запущен
- jz .no_jetaudio
- ; Сохранить хэндл окна
- mov ebx,eax
- ; Плеер активен?
- invoke SendMessage,ebx,WM_REMOCON_GETSTATUS,0,GET_STATUS_STATUS
- cmp eax,MCI_MODE_PLAY
- ; Плеер должен быть в состоянии "Воспроизведение"
- jne .no_jetaudio
- ; Музыка играет, можно запрашивать название трека
Code (Assembler) : Убрать нумерацию
- ; Отправить сообщения управляющему окну JetAudio
- invoke SendMessage,ebx,WM_REMOCON_GETSTATUS,[hwnddlg],\
- GET_STATUS_TRACK_ARTIST
- invoke SendMessage,ebx,WM_REMOCON_GETSTATUS,[hwnddlg],\
- GET_STATUS_TRACK_TITLE
Code (Assembler) : Убрать нумерацию
- ; Сообщение от окна JetAudio
- cmp [msg],WM_COPYDATA
- je .wmcopy
- ...
- .wmcopy:
- ; Обработка сообщений от JetAudio
- mov eax,[lparam]
- ; Это события от JetAudio?
- cmp [eax+COPYDATASTRUCT.dwData],JRC_COPYDATA_ID_TRACK_ARTIST
- je .copy_artist
- cmp [eax+COPYDATASTRUCT.dwData],JRC_COPYDATA_ID_TRACK_TITLE
- je .copy_title
- ...
- ; Обработка названия исполнителя
- .copy_artist:
- ; Проверить длину строки
- cmp [eax+COPYDATASTRUCT.cbData],0
- je @f
- ; Строка названия исполнителя в [eax+COPYDATASTRUCT.lpData]
- ...
- @@:
- ...
- ; Обработка названия трека
- .copy_title:
- ; Проверить длину строки
- cmp [eax+COPYDATASTRUCT.cbData],0
- je @f
- ; Строка названия трека в [eax+COPYDATASTRUCT.lpData]
- ...
- @@:
- ...
В приложении пример программы с исходным текстом, получающей название исполнителя и трека, который сейчас воспроизводится в JetAudio.
Просмотров: 4547 | Комментариев: 0
Метки: Assembler, мультимедиа
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария