-
Notifications
You must be signed in to change notification settings - Fork 30
/
audio_config.go
156 lines (136 loc) · 5.57 KB
/
audio_config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
package audio
import (
"unsafe"
"github.com/Microsoft/cognitive-services-speech-sdk-go/common"
)
// #include <stdlib.h>
// #include <speechapi_c_common.h>
// #include <speechapi_c_property_bag.h>
// #include <speechapi_c_audio_config.h>
import "C"
// AudioConfig represents specific audio configuration, such as microphone, file, or custom audio streams.
type AudioConfig struct {
handle C.SPXHANDLE
properties *common.PropertyCollection
}
// GetHandle gets the handle to the resource (for internal use)
func (config AudioConfig) GetHandle() common.SPXHandle {
return handle2uintptr(config.handle)
}
// Close releases the underlying resources
func (config AudioConfig) Close() {
config.properties.Close()
C.audio_config_release(config.handle)
}
func newAudioConfigFromHandle(handle C.SPXHANDLE) (*AudioConfig, error) {
var propBagHandle C.SPXPROPERTYBAGHANDLE
ret := uintptr(C.audio_config_get_property_bag(handle, &propBagHandle))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
config := new(AudioConfig)
config.handle = handle
config.properties = common.NewPropertyCollectionFromHandle(handle2uintptr(propBagHandle))
return config, nil
}
// NewAudioConfigFromDefaultMicrophoneInput creates an AudioConfig object representing the default microphone on the system.
func NewAudioConfigFromDefaultMicrophoneInput() (*AudioConfig, error) {
var handle C.SPXHANDLE
ret := uintptr(C.audio_config_create_audio_input_from_default_microphone(&handle))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromMicrophoneInput creates an AudioConfig object representing a specific microphone on the system.
func NewAudioConfigFromMicrophoneInput(deviceName string) (*AudioConfig, error) {
var handle C.SPXHANDLE
dn := C.CString(deviceName)
defer C.free(unsafe.Pointer(dn))
ret := uintptr(C.audio_config_create_audio_input_from_a_microphone(&handle, dn))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromWavFileInput creates an AudioConfig object representing the specified file.
func NewAudioConfigFromWavFileInput(filename string) (*AudioConfig, error) {
var handle C.SPXHANDLE
fn := C.CString(filename)
defer C.free(unsafe.Pointer(fn))
ret := uintptr(C.audio_config_create_audio_input_from_wav_file_name(&handle, fn))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromStreamInput creates an AudioConfig object representing the specified stream.
func NewAudioConfigFromStreamInput(stream AudioInputStream) (*AudioConfig, error) {
var handle C.SPXHANDLE
ret := uintptr(C.audio_config_create_audio_input_from_stream(&handle, stream.getHandle()))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromDefaultSpeakerOutput creates an AudioConfig object representing the default audio output device
// (speaker) on the system.
func NewAudioConfigFromDefaultSpeakerOutput() (*AudioConfig, error) {
var handle C.SPXHANDLE
ret := uintptr(C.audio_config_create_audio_output_from_default_speaker(&handle))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromSpeakerOutput creates an AudioConfig object representing the specific audio output device
// (speaker) on the system.
func NewAudioConfigFromSpeakerOutput(deviceName string) (*AudioConfig, error) {
var handle C.SPXHANDLE
dn := C.CString(deviceName)
defer C.free(unsafe.Pointer(dn))
ret := uintptr(C.audio_config_create_audio_output_from_a_speaker(&handle, dn))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromWavFileOutput creates an AudioConfig object representing the specified file for audio output.
func NewAudioConfigFromWavFileOutput(filename string) (*AudioConfig, error) {
var handle C.SPXHANDLE
fn := C.CString(filename)
defer C.free(unsafe.Pointer(fn))
ret := uintptr(C.audio_config_create_audio_output_from_wav_file_name(&handle, fn))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// NewAudioConfigFromStreamOutput creates an AudioConfig object representing the specified output stream.
func NewAudioConfigFromStreamOutput(stream AudioOutputStream) (*AudioConfig, error) {
var handle C.SPXHANDLE
streamHandle := stream.getHandle()
ret := uintptr(C.audio_config_create_audio_output_from_stream(&handle, streamHandle))
if ret != C.SPX_NOERROR {
return nil, common.NewCarbonError(ret)
}
return newAudioConfigFromHandle(handle)
}
// SetProperty sets a property value by ID.
func (config AudioConfig) SetProperty(id common.PropertyID, value string) error {
return config.properties.SetProperty(id, value)
}
// GetProperty gets a property value by ID.
func (config AudioConfig) GetProperty(id common.PropertyID) string {
return config.properties.GetProperty(id, "")
}
// SetPropertyByString sets a property value by name.
func (config AudioConfig) SetPropertyByString(name string, value string) error {
return config.properties.SetPropertyByString(name, value)
}
// GetPropertyByString gets a property value by name.
func (config AudioConfig) GetPropertyByString(name string) string {
return config.properties.GetPropertyByString(name, "")
}