mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
Fixed mac audin
This commit is contained in:
parent
31f933bc11
commit
44d1438eac
@ -47,7 +47,6 @@
|
|||||||
#include "audin_main.h"
|
#include "audin_main.h"
|
||||||
|
|
||||||
#define MAC_AUDIO_QUEUE_NUM_BUFFERS 100
|
#define MAC_AUDIO_QUEUE_NUM_BUFFERS 100
|
||||||
#define MAC_AUDIO_QUEUE_BUFFER_SIZE 32768
|
|
||||||
|
|
||||||
/* Fix for #4462: Provide type alias if not declared (Mac OS < 10.10)
|
/* Fix for #4462: Provide type alias if not declared (Mac OS < 10.10)
|
||||||
* https://developer.apple.com/documentation/coreaudio/audioformatid
|
* https://developer.apple.com/documentation/coreaudio/audioformatid
|
||||||
@ -85,30 +84,16 @@ static AudioFormatID audin_mac_get_format(const AUDIO_FORMAT* format)
|
|||||||
{
|
{
|
||||||
case WAVE_FORMAT_PCM:
|
case WAVE_FORMAT_PCM:
|
||||||
return kAudioFormatLinearPCM;
|
return kAudioFormatLinearPCM;
|
||||||
/*
|
|
||||||
case WAVE_FORMAT_GSM610:
|
|
||||||
return kAudioFormatMicrosoftGSM;
|
|
||||||
case WAVE_FORMAT_ALAW:
|
|
||||||
return kAudioFormatALaw;
|
|
||||||
case WAVE_FORMAT_MULAW:
|
|
||||||
return kAudioFormatULaw;
|
|
||||||
case WAVE_FORMAT_AAC_MS:
|
|
||||||
return kAudioFormatMPEG4AAC;
|
|
||||||
case WAVE_FORMAT_ADPCM:
|
|
||||||
case WAVE_FORMAT_DVI_ADPCM:
|
|
||||||
return kAudioFormatLinearPCM;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static AudioFormatFlags audin_mac_get_flags_for_format(const AUDIO_FORMAT* format)
|
static AudioFormatFlags audin_mac_get_flags_for_format(const AUDIO_FORMAT* format)
|
||||||
{
|
{
|
||||||
switch (format->wFormatTag)
|
switch (format->wFormatTag)
|
||||||
{
|
{
|
||||||
case WAVE_FORMAT_DVI_ADPCM:
|
|
||||||
case WAVE_FORMAT_ADPCM:
|
|
||||||
case WAVE_FORMAT_PCM:
|
case WAVE_FORMAT_PCM:
|
||||||
return kAudioFormatFlagIsSignedInteger;
|
return kAudioFormatFlagIsSignedInteger;
|
||||||
|
|
||||||
@ -150,26 +135,19 @@ static UINT audin_mac_set_format(IAudinDevice* device, const AUDIO_FORMAT* forma
|
|||||||
WLog_INFO(TAG, "Audio Format %s [channels=%d, samples=%d, bits=%d]",
|
WLog_INFO(TAG, "Audio Format %s [channels=%d, samples=%d, bits=%d]",
|
||||||
rdpsnd_get_audio_tag_string(format->wFormatTag),
|
rdpsnd_get_audio_tag_string(format->wFormatTag),
|
||||||
format->nChannels, format->nSamplesPerSec, format->wBitsPerSample);
|
format->nChannels, format->nSamplesPerSec, format->wBitsPerSample);
|
||||||
|
mac->audioFormat.mBitsPerChannel = format->wBitsPerSample;
|
||||||
|
|
||||||
switch (format->wFormatTag)
|
if (format->wBitsPerSample == 0)
|
||||||
{
|
mac->audioFormat.mBitsPerChannel = 16;
|
||||||
case WAVE_FORMAT_ADPCM:
|
|
||||||
case WAVE_FORMAT_DVI_ADPCM:
|
|
||||||
mac->FramesPerPacket *= 4; /* Compression ratio. */
|
|
||||||
mac->format.wBitsPerSample *= 4;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mac->audioFormat.mBitsPerChannel = mac->format.wBitsPerSample;
|
mac->audioFormat.mBytesPerFrame = 0;
|
||||||
|
mac->audioFormat.mBytesPerPacket = 0;
|
||||||
mac->audioFormat.mChannelsPerFrame = mac->format.nChannels;
|
mac->audioFormat.mChannelsPerFrame = mac->format.nChannels;
|
||||||
mac->audioFormat.mFormatFlags = audin_mac_get_flags_for_format(format);
|
mac->audioFormat.mFormatFlags = audin_mac_get_flags_for_format(format);
|
||||||
mac->audioFormat.mFormatID = audin_mac_get_format(format);
|
mac->audioFormat.mFormatID = audin_mac_get_format(format);
|
||||||
mac->audioFormat.mFramesPerPacket = 1;
|
mac->audioFormat.mFramesPerPacket = 1;
|
||||||
|
mac->audioFormat.mReserved = 0;
|
||||||
mac->audioFormat.mSampleRate = mac->format.nSamplesPerSec;
|
mac->audioFormat.mSampleRate = mac->format.nSamplesPerSec;
|
||||||
mac->audioFormat.mBytesPerFrame =
|
|
||||||
mac->audioFormat.mChannelsPerFrame * mac->audioFormat.mBitsPerChannel / 8;
|
|
||||||
mac->audioFormat.mBytesPerPacket =
|
|
||||||
mac->audioFormat.mBytesPerFrame * mac->audioFormat.mFramesPerPacket;
|
|
||||||
return CHANNEL_RC_OK;
|
return CHANNEL_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +159,7 @@ static void mac_audio_queue_input_cb(void* aqData,
|
|||||||
const AudioStreamPacketDescription* inPacketDesc)
|
const AudioStreamPacketDescription* inPacketDesc)
|
||||||
{
|
{
|
||||||
AudinMacDevice* mac = (AudinMacDevice*)aqData;
|
AudinMacDevice* mac = (AudinMacDevice*)aqData;
|
||||||
UINT error;
|
UINT error = CHANNEL_RC_OK;
|
||||||
const BYTE* buffer = inBuffer->mAudioData;
|
const BYTE* buffer = inBuffer->mAudioData;
|
||||||
int buffer_size = inBuffer->mAudioDataByteSize;
|
int buffer_size = inBuffer->mAudioDataByteSize;
|
||||||
(void)inAQ;
|
(void)inAQ;
|
||||||
@ -189,11 +167,14 @@ static void mac_audio_queue_input_cb(void* aqData,
|
|||||||
(void)inNumPackets;
|
(void)inNumPackets;
|
||||||
(void)inPacketDesc;
|
(void)inPacketDesc;
|
||||||
|
|
||||||
if ((error = mac->receive(&mac->format, buffer, buffer_size, mac->user_data)))
|
if (buffer_size > 0)
|
||||||
|
error = mac->receive(&mac->format, buffer, buffer_size, mac->user_data);
|
||||||
|
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
|
||||||
|
|
||||||
|
if (error)
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "mac->receive failed with error %"PRIu32"", error);
|
WLog_ERR(TAG, "mac->receive failed with error %"PRIu32"", error);
|
||||||
SetLastError(ERROR_INTERNAL_ERROR);
|
SetLastError(ERROR_INTERNAL_ERROR);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,7 +243,8 @@ static UINT audin_mac_open(IAudinDevice* device, AudinReceive receive, void* use
|
|||||||
|
|
||||||
for (index = 0; index < MAC_AUDIO_QUEUE_NUM_BUFFERS; index++)
|
for (index = 0; index < MAC_AUDIO_QUEUE_NUM_BUFFERS; index++)
|
||||||
{
|
{
|
||||||
devStat = AudioQueueAllocateBuffer(mac->audioQueue, MAC_AUDIO_QUEUE_BUFFER_SIZE,
|
devStat = AudioQueueAllocateBuffer(mac->audioQueue,
|
||||||
|
mac->FramesPerPacket * 2 * mac->format.nChannels,
|
||||||
&mac->audioBuffers[index]);
|
&mac->audioBuffers[index]);
|
||||||
|
|
||||||
if (devStat != 0)
|
if (devStat != 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user