2014-12-04 2 views
3

Я много читал об AudioToolbox и читал некоторый исходный пример в obj-c. Но я не могу заставить его работать в Swift.Как установить главный том системы из быстрого приложения в osx

Может кто-нибудь указать мне на решение, как установить мастер-объем из моего быстрого приложения?

например. этот пример: Setting Mac OSX Volume Programatically using XCode У меня отсутствует пример кода в https://developer.apple.com/library/mac/documentation/AudioToolbox/Reference/AudioHardwareServicesReference/index.html#//apple_ref/c/func/AudioHardwareServiceGetPropertyData

Спасибо за ваше время.

ответ

8

(код обновлен для Swift 3, версия Swift 2 можно найти в истории редактирования .)

Это то, что я получил от перевода ответов на Change OS X system volume programmatically и Setting Mac OSX Volume Programatically using XCode в Swift (проверка ошибок опущена для краткости):

Требуемые рамки:

import AudioToolbox 

Получить выходного устройства по умолчанию:

var defaultOutputDeviceID = AudioDeviceID(0) 
var defaultOutputDeviceIDSize = UInt32(MemoryLayout.size(ofValue: defaultOutputDeviceID)) 

var getDefaultOutputDevicePropertyAddress = AudioObjectPropertyAddress(
    mSelector: AudioObjectPropertySelector(kAudioHardwarePropertyDefaultOutputDevice), 
    mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal), 
    mElement: AudioObjectPropertyElement(kAudioObjectPropertyElementMaster)) 

let status1 = AudioObjectGetPropertyData(
    AudioObjectID(kAudioObjectSystemObject), 
    &getDefaultOutputDevicePropertyAddress, 
    0, 
    nil, 
    &defaultOutputDeviceIDSize, 
    &defaultOutputDeviceID) 

объем Set:

var volume = Float32(0.50) // 0.0 ... 1.0 
var volumeSize = UInt32(MemoryLayout.size(ofValue: volume)) 

var volumePropertyAddress = AudioObjectPropertyAddress(
    mSelector: AudioObjectPropertySelector(kAudioHardwareServiceDeviceProperty_VirtualMasterVolume), 
    mScope: AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput), 
    mElement: AudioObjectPropertyElement(kAudioObjectPropertyElementMaster)) 

let status2 = AudioObjectSetPropertyData(
    defaultOutputDeviceID, 
    &volumePropertyAddress, 
    0, 
    nil, 
    volumeSize, 
    &volume) 

Это немного более многословным, чем соответствующий код C, потому что многие аргументы нужно быть преобразован в тип параметра явно Swift.

Кредиты до Set OS X volume in OS X 10.11 using Swift without using the deprecated AudioHardwareServiceSetPropertyData API за использование AudioObjectSetPropertyData() вместо устаревших AudioHardwareServiceSetPropertyData().

+0

прохладный. большое спасибо. Теперь я вижу свои ошибки, которые я сделал с AudioDeviceId и kAudio .... –