Home

четверг, 19 ноября 2009 г.

Пнуть iTunes из Cocoa приложения

Хозяйке на заметку: Часто для управления iTunes из Cocoa приложения используют встроенный AppleScript. Это работает, но весьма ресурсоёмко и небыстро.
Нашел "чистый" метод, путем отсылки событий.

Ошметки кода:



#import



const OSType iTunesSignature = 'hook' ;

#define CMD_NEXT_TRACK 'Next'
#define CMD_PREV_TRACK 'Prev'
#define CMD_STOP 'Stop'
#define CMD_PLAY 'Play'



- (AppleEvent *) newCommandEvent:(AEEventID)eventId {
OSErr err ;
AppleEvent *cmdEvent = malloc(sizeof(AppleEvent)) ;
err = AEBuildAppleEvent(
iTunesSignature,
eventId,
typeApplSignature,
&iTunesSignature,
sizeof(iTunesSignature),
kAutoGenerateReturnID,
kAnyTransactionID,
cmdEvent,
NULL,
"'----':'null'()"
) ;

if (err != noErr) {
NSLog(@"Error creating Apple Event: %d", err) ;
free(cmdEvent) ;
return nil ;
}

return cmdEvent ;
}


- (void)sendCommand:(AEEventID)commandId {
OSErr err ;
AppleEvent *event = [self newCommandEvent:commandId] ;
err = AESendMessage(event, NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout) ;
if (err != noErr) {
NSLog(@"Error sending AppleEvent: %d", err) ;
}
AEDisposeDesc(event) ;
free(event) ;

}


- (IBAction) doNextTrack:(id)sender {
[self sendCommand:CMD_NEXT_TRACK] ;
}







2 коммент.:

ctrld комментирует...

Здорово! Отличный рецепт.
Я думаю, как можно из Cocoa получить текущую позицию проигрываемого в iTunes видео и появления события "Пауза", "Перемотка". Но это слегка другая тема.

tsybulin комментирует...

to ctrd: щас напишу, есть способ хороший

Отправить комментарий