Discussion:
[SoX-devel] sox src/coreaudio device name truncation fix
g***@ftml.net
2016-06-14 18:36:53 UTC
Permalink
I haven't tested this but it appears the code:

https://sourceforge.net/p/sox/code/ci/master/tree/src/coreaudio.c#l154
char name[256];
status = AudioDeviceGetProperty(devices[i],0,false,kAudioDevicePropertyDeviceName,&property_size,&name);

Needs to have
property_size = sizeof(name);
added before the AudioDeviceGetProperty call.

Otherwise property_size has the left over length from the previous request for the list of devices. I'm seeing
returned names truncated to 11 characters which is 12 including the \0 which matches the
3 device id's (at 4 bytes each) returned by the previous use of property_size.
--
http://www.fastmail.com - Does exactly what it says on the tin
Eric Wong
2016-06-15 07:22:52 UTC
Permalink
Post by g***@ftml.net
https://sourceforge.net/p/sox/code/ci/master/tree/src/coreaudio.c#l154
char name[256];
status = AudioDeviceGetProperty(devices[i],0,false,kAudioDevicePropertyDeviceName,&property_size,&name);
Needs to have
property_size = sizeof(name);
added before the AudioDeviceGetProperty call.
Otherwise property_size has the left over length from the previous request for the list of devices. I'm seeing
returned names truncated to 11 characters which is 12 including the \0 which matches the
3 device id's (at 4 bytes each) returned by the previous use of property_size.
Seems reasonable. Can you test this?
(or provide at least provide a documentation reference).

If not, is there someone else here who can?

Thanks.
g***@ftml.net
2016-06-15 14:09:31 UTC
Permalink
Post by Eric Wong
Seems reasonable. Can you test this?
(or provide at least provide a documentation reference).
The AudioDeviceGetProperty function is documented in the
CoreAudio header file AudioHardwareDeprecated.h and it is
very clear that property_size needs to be the size of the
receiving area on the call and gets set to the length of the
data returned by the call.

@function AudioDeviceGetProperty
@abstract Queries an the AudioDevice object to get the data of
the given property and
places it in the provided buffer.
@discussion Note that the same functionality is provided by the
function
AudioObjectGetPropertyData().
@param inDevice
The AudioDevice to query.
@param inChannel
The channel of the property to query where 0 is
the master channel.
@param isInput
Which section of the AudioDevice to query.
@param inPropertyID
The AudioDevicePropertyID of the property to
query.
@param ioPropertyDataSize
A UInt32 which on entry indicates the size of
the buffer pointed to by
outData and on exit indicates how much of the
buffer was used.
@param outPropertyData
The buffer into which the object will put the
data for the given property.
@result An OSStatus indicating success or failure.
*/
extern OSStatus
AudioDeviceGetProperty( AudioDeviceID inDevice,
UInt32 inChannel,
Boolean isInput,
AudioDevicePropertyID inPropertyID,
UInt32* ioPropertyDataSize,
void* outPropertyData)

PS: Changing from using the deprecated CoreAudio interfaces would be a
larger change...
--
http://www.fastmail.com - Same, same, but different...
Eric Wong
2016-06-16 02:50:55 UTC
Permalink
***@ftml.net wrote:

<snip>

Thanks. Pushed to the "pu" (potential updates) branch of
git://80x24.org/sox

https://80x24.org/sox.git/patch?id=bf2afa54a7dec
Post by g***@ftml.net
PS: Changing from using the deprecated CoreAudio interfaces would be a
larger change...
Mans and I are just keeping the lights on until Chris and
the others return, and I only use GNU/Linux.

Loading...