Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
5eedda69
Commit
5eedda69
authored
May 28, 2020
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
output/osx: make more AudioObjectPropertyAddress instances `static constexpr`
parent
a30d5e1b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
64 additions
and
34 deletions
+64
-34
OSXOutputPlugin.cxx
src/output/plugins/OSXOutputPlugin.cxx
+64
-34
No files found.
src/output/plugins/OSXOutputPlugin.cxx
View file @
5eedda69
...
@@ -160,25 +160,28 @@ AudioOutput *
...
@@ -160,25 +160,28 @@ AudioOutput *
OSXOutput
::
Create
(
EventLoop
&
,
const
ConfigBlock
&
block
)
OSXOutput
::
Create
(
EventLoop
&
,
const
ConfigBlock
&
block
)
{
{
OSXOutput
*
oo
=
new
OSXOutput
(
block
);
OSXOutput
*
oo
=
new
OSXOutput
(
block
);
AudioObjectPropertyAddress
aopa
;
AudioDeviceID
dev_id
=
kAudioDeviceUnknown
;
AudioDeviceID
dev_id
=
kAudioDeviceUnknown
;
UInt32
dev_id_size
=
sizeof
(
dev_id
);
UInt32
dev_id_size
=
sizeof
(
dev_id
);
if
(
oo
->
component_subtype
==
kAudioUnitSubType_SystemOutput
)
static
constexpr
AudioObjectPropertyAddress
default_system_output_device
{
kAudioHardwarePropertyDefaultSystemOutputDevice
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
,
};
static
constexpr
AudioObjectPropertyAddress
default_output_device
{
kAudioHardwarePropertyDefaultOutputDevice
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
};
const
auto
&
aopa
=
oo
->
component_subtype
==
kAudioUnitSubType_SystemOutput
// get system output dev_id if configured
// get system output dev_id if configured
aopa
=
{
?
default_system_output_device
kAudioHardwarePropertyDefaultSystemOutputDevice
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
};
else
/* fallback to default device initially (can still be
/* fallback to default device initially (can still be
changed by osx_output_set_device) */
changed by osx_output_set_device) */
aopa
=
{
:
default_output_device
;
kAudioHardwarePropertyDefaultOutputDevice
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
};
AudioObjectGetPropertyData
(
kAudioObjectSystemObject
,
AudioObjectGetPropertyData
(
kAudioObjectSystemObject
,
&
aopa
,
&
aopa
,
...
@@ -386,14 +389,34 @@ static Float64
...
@@ -386,14 +389,34 @@ static Float64
osx_output_set_device_format
(
AudioDeviceID
dev_id
,
osx_output_set_device_format
(
AudioDeviceID
dev_id
,
const
AudioStreamBasicDescription
&
target_format
)
const
AudioStreamBasicDescription
&
target_format
)
{
{
AudioObjectPropertyAddress
aopa
=
{
static
constexpr
AudioObjectPropertyAddress
aopa_device_streams
=
{
kAudioDevicePropertyStreams
,
kAudioDevicePropertyStreams
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
kAudioObjectPropertyElementMaster
};
};
static
constexpr
AudioObjectPropertyAddress
aopa_stream_direction
=
{
kAudioStreamPropertyDirection
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
};
static
constexpr
AudioObjectPropertyAddress
aopa_stream_phys_formats
=
{
kAudioStreamPropertyAvailablePhysicalFormats
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
};
static
constexpr
AudioObjectPropertyAddress
aopa_stream_phys_format
=
{
kAudioStreamPropertyPhysicalFormat
,
kAudioObjectPropertyScopeOutput
,
kAudioObjectPropertyElementMaster
};
UInt32
property_size
;
UInt32
property_size
;
OSStatus
err
=
AudioObjectGetPropertyDataSize
(
dev_id
,
&
aopa
,
0
,
NULL
,
&
property_size
);
OSStatus
err
=
AudioObjectGetPropertyDataSize
(
dev_id
,
&
aopa_device_streams
,
0
,
NULL
,
&
property_size
);
if
(
err
!=
noErr
)
if
(
err
!=
noErr
)
throw
FormatRuntimeError
(
"Cannot get number of streams: %d
\n
"
,
err
);
throw
FormatRuntimeError
(
"Cannot get number of streams: %d
\n
"
,
err
);
...
@@ -403,7 +426,8 @@ osx_output_set_device_format(AudioDeviceID dev_id,
...
@@ -403,7 +426,8 @@ osx_output_set_device_format(AudioDeviceID dev_id,
throw
std
::
runtime_error
(
"Too many streams"
);
throw
std
::
runtime_error
(
"Too many streams"
);
AudioStreamID
streams
[
MAX_STREAMS
];
AudioStreamID
streams
[
MAX_STREAMS
];
err
=
AudioObjectGetPropertyData
(
dev_id
,
&
aopa
,
0
,
NULL
,
&
property_size
,
streams
);
err
=
AudioObjectGetPropertyData
(
dev_id
,
&
aopa_device_streams
,
0
,
NULL
,
&
property_size
,
streams
);
if
(
err
!=
noErr
)
if
(
err
!=
noErr
)
throw
FormatRuntimeError
(
"Cannot get streams: %d
\n
"
,
err
);
throw
FormatRuntimeError
(
"Cannot get streams: %d
\n
"
,
err
);
...
@@ -414,10 +438,9 @@ osx_output_set_device_format(AudioDeviceID dev_id,
...
@@ -414,10 +438,9 @@ osx_output_set_device_format(AudioDeviceID dev_id,
for
(
size_t
i
=
0
;
i
<
n_streams
;
i
++
)
{
for
(
size_t
i
=
0
;
i
<
n_streams
;
i
++
)
{
UInt32
direction
;
UInt32
direction
;
AudioStreamID
stream
=
streams
[
i
];
AudioStreamID
stream
=
streams
[
i
];
aopa
.
mSelector
=
kAudioStreamPropertyDirection
;
property_size
=
sizeof
(
direction
);
property_size
=
sizeof
(
direction
);
err
=
AudioObjectGetPropertyData
(
stream
,
err
=
AudioObjectGetPropertyData
(
stream
,
&
aopa
,
&
aopa
_stream_direction
,
0
,
0
,
NULL
,
NULL
,
&
property_size
,
&
property_size
,
...
@@ -429,9 +452,9 @@ osx_output_set_device_format(AudioDeviceID dev_id,
...
@@ -429,9 +452,9 @@ osx_output_set_device_format(AudioDeviceID dev_id,
if
(
direction
!=
0
)
if
(
direction
!=
0
)
continue
;
continue
;
aopa
.
mSelector
=
kAudioStreamPropertyAvailablePhysicalFormats
;
err
=
AudioObjectGetPropertyDataSize
(
stream
,
err
=
AudioObjectGetPropertyDataSize
(
stream
,
&
aopa
,
0
,
NULL
,
&
aopa_stream_phys_formats
,
&
property_size
);
0
,
NULL
,
&
property_size
);
if
(
err
!=
noErr
)
if
(
err
!=
noErr
)
throw
FormatRuntimeError
(
"Unable to get format size s for stream %d. Error = %s"
,
throw
FormatRuntimeError
(
"Unable to get format size s for stream %d. Error = %s"
,
streams
[
i
],
err
);
streams
[
i
],
err
);
...
@@ -442,7 +465,10 @@ osx_output_set_device_format(AudioDeviceID dev_id,
...
@@ -442,7 +465,10 @@ osx_output_set_device_format(AudioDeviceID dev_id,
throw
std
::
runtime_error
(
"Too many formats"
);
throw
std
::
runtime_error
(
"Too many formats"
);
AudioStreamRangedDescription
format_list
[
MAX_FORMATS
];
AudioStreamRangedDescription
format_list
[
MAX_FORMATS
];
err
=
AudioObjectGetPropertyData
(
stream
,
&
aopa
,
0
,
NULL
,
&
property_size
,
format_list
);
err
=
AudioObjectGetPropertyData
(
stream
,
&
aopa_stream_phys_formats
,
0
,
NULL
,
&
property_size
,
format_list
);
if
(
err
!=
noErr
)
if
(
err
!=
noErr
)
throw
FormatRuntimeError
(
"Unable to get available formats for stream %d. Error = %s"
,
throw
FormatRuntimeError
(
"Unable to get available formats for stream %d. Error = %s"
,
streams
[
i
],
err
);
streams
[
i
],
err
);
...
@@ -474,9 +500,8 @@ osx_output_set_device_format(AudioDeviceID dev_id,
...
@@ -474,9 +500,8 @@ osx_output_set_device_format(AudioDeviceID dev_id,
}
}
if
(
format_found
)
{
if
(
format_found
)
{
aopa
.
mSelector
=
kAudioStreamPropertyPhysicalFormat
;
err
=
AudioObjectSetPropertyData
(
output_stream
,
err
=
AudioObjectSetPropertyData
(
output_stream
,
&
aopa
,
&
aopa
_stream_phys_format
,
0
,
0
,
NULL
,
NULL
,
sizeof
(
output_format
),
sizeof
(
output_format
),
...
@@ -604,7 +629,6 @@ osx_output_set_device(OSXOutput *oo)
...
@@ -604,7 +629,6 @@ osx_output_set_device(OSXOutput *oo)
{
{
OSStatus
status
;
OSStatus
status
;
UInt32
size
,
numdevices
;
UInt32
size
,
numdevices
;
AudioObjectPropertyAddress
propaddr
;
CFStringRef
cfname
=
nullptr
;
CFStringRef
cfname
=
nullptr
;
char
errormsg
[
1024
];
char
errormsg
[
1024
];
char
name
[
256
];
char
name
[
256
];
...
@@ -619,11 +643,14 @@ osx_output_set_device(OSXOutput *oo)
...
@@ -619,11 +643,14 @@ osx_output_set_device(OSXOutput *oo)
return
;
return
;
/* how many audio devices are there? */
/* how many audio devices are there? */
propaddr
=
{
kAudioHardwarePropertyDevices
,
static
constexpr
AudioObjectPropertyAddress
aopa_hw_devices
{
kAudioObjectPropertyScopeGlobal
,
kAudioHardwarePropertyDevices
,
kAudioObjectPropertyElementMaster
};
kAudioObjectPropertyScopeGlobal
,
kAudioObjectPropertyElementMaster
,
};
status
=
AudioObjectGetPropertyDataSize
(
kAudioObjectSystemObject
,
status
=
AudioObjectGetPropertyDataSize
(
kAudioObjectSystemObject
,
&
propaddr
,
0
,
nullptr
,
&
size
);
&
aopa_hw_devices
,
0
,
nullptr
,
&
size
);
if
(
status
!=
noErr
)
{
if
(
status
!=
noErr
)
{
osx_os_status_to_cstring
(
status
,
errormsg
,
sizeof
(
errormsg
));
osx_os_status_to_cstring
(
status
,
errormsg
,
sizeof
(
errormsg
));
throw
FormatRuntimeError
(
"Unable to determine number of OS X audio devices: %s"
,
throw
FormatRuntimeError
(
"Unable to determine number of OS X audio devices: %s"
,
...
@@ -634,7 +661,7 @@ osx_output_set_device(OSXOutput *oo)
...
@@ -634,7 +661,7 @@ osx_output_set_device(OSXOutput *oo)
numdevices
=
size
/
sizeof
(
AudioDeviceID
);
numdevices
=
size
/
sizeof
(
AudioDeviceID
);
std
::
unique_ptr
<
AudioDeviceID
[]
>
deviceids
(
new
AudioDeviceID
[
numdevices
]);
std
::
unique_ptr
<
AudioDeviceID
[]
>
deviceids
(
new
AudioDeviceID
[
numdevices
]);
status
=
AudioObjectGetPropertyData
(
kAudioObjectSystemObject
,
status
=
AudioObjectGetPropertyData
(
kAudioObjectSystemObject
,
&
propaddr
,
0
,
nullptr
,
&
aopa_hw_devices
,
0
,
nullptr
,
&
size
,
deviceids
.
get
());
&
size
,
deviceids
.
get
());
if
(
status
!=
noErr
)
{
if
(
status
!=
noErr
)
{
osx_os_status_to_cstring
(
status
,
errormsg
,
sizeof
(
errormsg
));
osx_os_status_to_cstring
(
status
,
errormsg
,
sizeof
(
errormsg
));
...
@@ -643,12 +670,15 @@ osx_output_set_device(OSXOutput *oo)
...
@@ -643,12 +670,15 @@ osx_output_set_device(OSXOutput *oo)
}
}
/* which audio device matches oo->device_name? */
/* which audio device matches oo->device_name? */
propaddr
=
{
kAudioObjectPropertyName
,
static
constexpr
AudioObjectPropertyAddress
aopa_name
{
kAudioObjectPropertyScopeGlobal
,
kAudioObjectPropertyName
,
kAudioObjectPropertyElementMaster
};
kAudioObjectPropertyScopeGlobal
,
kAudioObjectPropertyElementMaster
,
};
size
=
sizeof
(
CFStringRef
);
size
=
sizeof
(
CFStringRef
);
for
(
i
=
0
;
i
<
numdevices
;
i
++
)
{
for
(
i
=
0
;
i
<
numdevices
;
i
++
)
{
status
=
AudioObjectGetPropertyData
(
deviceids
[
i
],
&
propaddr
,
status
=
AudioObjectGetPropertyData
(
deviceids
[
i
],
&
aopa_name
,
0
,
nullptr
,
0
,
nullptr
,
&
size
,
&
cfname
);
&
size
,
&
cfname
);
if
(
status
!=
noErr
)
{
if
(
status
!=
noErr
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment