Как определить, работает ли видео на Mac? - PullRequest
3 голосов
/ 22 ноября 2011

Я хочу знать простой Mac. В настоящее время я использую этот код

CFMutableDictionaryRef properties = 0;
CFTypeRef obj;
mach_port_t masterPort;
io_iterator_t iter;
io_registry_entry_t curObj;

IOMasterPort(MACH_PORT_NULL, &masterPort);

/* Get IOHIDSystem */
IOServiceGetMatchingServices(masterPort, IOServiceMatching("IOHIDSystem"), &iter);
if (iter == 0)
{
    return -1;
}
else
{
    curObj = IOIteratorNext(iter);
}
if (IORegistryEntryCreateCFProperties(curObj, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties != NULL)
{
    obj = CFDictionaryGetValue(properties, CFSTR("HIDIdleTime"));
    CFRetain(obj);
}
else
{
    return -1;
}

uint64_t tHandle = 0;
if (obj)
{
    CFTypeID type = CFGetTypeID(obj);

    if (type == CFDataGetTypeID())
    {
        CFDataGetBytes((CFDataRef) obj, CFRangeMake(0, sizeof(tHandle)), (UInt8*) &tHandle);
    }
    else if (type == CFNumberGetTypeID())
    {
        CFNumberGetValue((CFNumberRef)obj, kCFNumberSInt64Type, &tHandle);
    }
    else
    {
        // error
        tHandle = 0;
    }

    CFRelease(obj);

    tHandle /= 1000000; // return as milliseconds
}
else
{
    tHandle = -1;
}

CFRelease((CFTypeRef)properties);
IOObjectRelease(curObj);
IOObjectRelease(iter);
return (double)tHandle;

Однако я хочу, чтобы время простоя оставалось равным 0, если запущено какое-либо видео.

Есть ли пример кода или библиотека для проверки? (включая видео, запущенное в iTunes, VLC, YouTube в браузере или любые другие видеоприложения)

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Я могу интерпретировать ваш вопрос несколькими способами:

Как определить, когда появится заставка?

Проверьте следующий скрипт ( оригинальный ответ ):

#!/bin/bash

systemSleepTimeMinutes=`pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'`

if [ $systemSleepTimeMinutes -gt "0" ]; then
    systemSleepTime=`echo "$systemSleepTimeMinutes * 60" | bc`
    devicesIdleTime=`ioreg -c IOHIDSystem | awk '/HIDIdleTime/ {print $NF/1000000000; exit}'`
    secondsBeforeSleep=`echo "$systemSleepTime - $devicesIdleTime" | bc`
    echo "Time before sleep (sec): $secondsBeforeSleep"
    exit 0
else
    echo "The system is set to not sleep."
    exit 0
fi

В случае, если экранная заставка подавлена, например, VLC, результатом будет:

Система отключена.

В противном случае возвращается время до появления заставки, например:

Время до сна (сек): 899,88056

Запустите указанный выше сценарий через NSTask или NSAppleScript и проанализируйте результат.
Обратите внимание, что «сон» может также вернуться к заставке, в зависимости от того, какой из них пинает первым.

Как определить, подавлена ​​ли заставка?

Следующая строка делает трюк:

pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'

Если экранная заставка отключена, она возвращает 0.
Выполните строку выше через NSTask или NSAppleScript и проанализируйте результат.

Как подавить заставку?

Официальная документация Apple (включая фрагмент кода):
Как я могу предотвратить системный сон во время работы моего приложения?


РЕДАКТИРОВАТЬ (Ответ на комментарий)

Однако есть ли встроенный метод, который работает так же, как этот скрипт?

Я не знаком с таким методом. Я на самом деле сомневаюсь, что это существует.

Быстрый NSAppleScript пример:

NSString *source = @"do shell script \"pmset -g | grep \\\"^[ ]*sleep\\\" | awk '{ print $2 }'\"";
NSAppleScript *script= [[NSAppleScript alloc] initWithSource:source];
NSDictionary *scriptError = nil;
NSAppleEventDescriptor *descriptor=[script executeAndReturnError:&scriptError];
if(scriptError) {
    NSLog(@"Error: %@",scriptError);
} else {
    if ([[descriptor stringValue] intValue] == 0) {
        NSLog(@"Screensaver suppressed.");
    } else {
        NSLog(@"Screensaver not suppressed.");
    }
}

Только не отказывайтесь от использования NSTask или NSAppleScript:)

0 голосов
/ 06 июля 2012

Еще лучше, смотрите com.apple.screensaver.didstart и com.apple.screensaver.didstop

...