Implement core audio methods for getting/setting volume settings
This commit is contained in:
parent
45520c9513
commit
ac1f672891
134
src/volume/coreAudio.go
Normal file
134
src/volume/coreAudio.go
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package volume
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo CFLAGS: -x objective-c
|
||||||
|
#cgo LDFLAGS: -framework CoreAudio
|
||||||
|
#include <CoreAudio/CoreAudio.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OSStatus C.OSStatus
|
||||||
|
|
||||||
|
const (
|
||||||
|
AudioHardwareNoError = C.kAudioHardwareNoError
|
||||||
|
)
|
||||||
|
|
||||||
|
type AudioObjectID uint32
|
||||||
|
|
||||||
|
func GetDefaultOutputDevice() (AudioObjectID, OSStatus) {
|
||||||
|
properties := C.AudioObjectPropertyAddress{
|
||||||
|
C.kAudioHardwarePropertyDefaultOutputDevice,
|
||||||
|
C.kAudioObjectPropertyScopeGlobal,
|
||||||
|
C.kAudioObjectPropertyElementMain,
|
||||||
|
}
|
||||||
|
|
||||||
|
var data C.AudioObjectID
|
||||||
|
dataSize := C.UInt32(unsafe.Sizeof(data))
|
||||||
|
|
||||||
|
result := C.AudioObjectGetPropertyData(
|
||||||
|
C.kAudioObjectSystemObject,
|
||||||
|
&properties,
|
||||||
|
C.UInt32(0),
|
||||||
|
unsafe.Pointer(nil),
|
||||||
|
&dataSize,
|
||||||
|
unsafe.Pointer(&data),
|
||||||
|
)
|
||||||
|
|
||||||
|
return AudioObjectID(data), OSStatus(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetVolume(objectID AudioObjectID) (float32, OSStatus) {
|
||||||
|
|
||||||
|
properties := C.AudioObjectPropertyAddress{
|
||||||
|
C.kAudioDevicePropertyVolumeScalar,
|
||||||
|
C.kAudioDevicePropertyScopeOutput,
|
||||||
|
0, //main channel
|
||||||
|
}
|
||||||
|
|
||||||
|
var data C.Float32
|
||||||
|
dataSize := C.UInt32(unsafe.Sizeof(data))
|
||||||
|
|
||||||
|
result := C.AudioObjectGetPropertyData(
|
||||||
|
C.AudioObjectID(objectID),
|
||||||
|
&properties,
|
||||||
|
C.UInt32(0),
|
||||||
|
unsafe.Pointer(nil),
|
||||||
|
&dataSize,
|
||||||
|
unsafe.Pointer(&data),
|
||||||
|
)
|
||||||
|
|
||||||
|
return float32(data), OSStatus(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetVolume(objectID AudioObjectID, volume float32) OSStatus {
|
||||||
|
|
||||||
|
properties := C.AudioObjectPropertyAddress{
|
||||||
|
C.kAudioDevicePropertyVolumeScalar,
|
||||||
|
C.kAudioDevicePropertyScopeOutput,
|
||||||
|
0, //main channel
|
||||||
|
}
|
||||||
|
|
||||||
|
data := C.Float32(volume)
|
||||||
|
|
||||||
|
result := C.AudioObjectSetPropertyData(
|
||||||
|
C.AudioObjectID(objectID),
|
||||||
|
&properties,
|
||||||
|
C.UInt32(0),
|
||||||
|
unsafe.Pointer(nil),
|
||||||
|
C.UInt32(unsafe.Sizeof(data)),
|
||||||
|
unsafe.Pointer(&data),
|
||||||
|
)
|
||||||
|
|
||||||
|
return OSStatus(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMute(objectID AudioObjectID) (bool, OSStatus) {
|
||||||
|
|
||||||
|
properties := C.AudioObjectPropertyAddress{
|
||||||
|
C.kAudioDevicePropertyMute,
|
||||||
|
C.kAudioDevicePropertyScopeOutput,
|
||||||
|
0, //main channel
|
||||||
|
}
|
||||||
|
|
||||||
|
var data C.UInt32
|
||||||
|
dataSize := C.UInt32(unsafe.Sizeof(data))
|
||||||
|
|
||||||
|
result := C.AudioObjectGetPropertyData(
|
||||||
|
C.AudioObjectID(objectID),
|
||||||
|
&properties,
|
||||||
|
C.UInt32(0),
|
||||||
|
unsafe.Pointer(nil),
|
||||||
|
&dataSize,
|
||||||
|
unsafe.Pointer(&data),
|
||||||
|
)
|
||||||
|
|
||||||
|
dataAsBool := uint32(data) != 0
|
||||||
|
return dataAsBool, OSStatus(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetMute(objectID AudioObjectID, mute bool) OSStatus {
|
||||||
|
|
||||||
|
properties := C.AudioObjectPropertyAddress{
|
||||||
|
C.kAudioDevicePropertyMute,
|
||||||
|
C.kAudioDevicePropertyScopeOutput,
|
||||||
|
0, //main channel
|
||||||
|
}
|
||||||
|
|
||||||
|
data := C.UInt32(0)
|
||||||
|
if mute {
|
||||||
|
data = C.UInt32(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := C.AudioObjectSetPropertyData(
|
||||||
|
C.AudioObjectID(objectID),
|
||||||
|
&properties,
|
||||||
|
C.UInt32(0),
|
||||||
|
unsafe.Pointer(nil),
|
||||||
|
C.UInt32(unsafe.Sizeof(data)),
|
||||||
|
unsafe.Pointer(&data),
|
||||||
|
)
|
||||||
|
return OSStatus(result)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user