Я написал плагин Quick Look, который пытается воспроизводить музыку следующим образом:
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
NSURL *fileURL = (__bridge NSURL*)url;
AudioPlayer *player = // load player with fileURL
// Create a semaphore
sema = dispatch_semaphore_create(0);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
// Start playback and signal the semaphore once finished
[player play:^{
dispatch_semaphore_signal(sema);
}];
// Wait here until the player completion block signals the semaphore to stop waiting
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
NSLog(@"%@", @"done!");
return kQLReturnNoError;
}
По разным причинам для меня не практично транскодировать эти аудиофайлы в формат, который знает macOS, илииначе я мог бы просто передать ОС файл MP3 и получить плагин системы для его воспроизведения.Поэтому вместо этого я использую грязный хак с семафорами, чтобы остановить выполнение, чтобы сохранить объект моего проигрывателя, иначе он внезапно остановился бы сразу после начала воспроизведения.
Проблема в том, что файл просто продолжитсяВоспроизведение после того, как панель «Быстрый просмотр» прекращает его предварительный просмотр из-за все еще запущенного процесса quicklookd.
Есть ли способ остановить воспроизведение, как это делают системные плагины, когда они закрываются?