Технические вопросы и ответы QA1196

Частоты дискретизации AudioDevice

Q: Как я получаю и устанавливаю частоту дискретизации для AudioDevice? Что, если мое входное аудиоустройство имеет различную частоту дискретизации, чем устройство вывода, как я могу обработать преобразования между двумя?

A: Код ниже взят из Источников Предприятия коммунального обслуживания CoreAudio (/Developer/Extras/CoreAudio/PublicUtility/CAHALAudioDevice.*), и может использоваться, чтобы получить и установить доступные диапазоны частоты дискретизации для данного Аудиоустройства HAL.

Перечисление 1  , Как получить и установить доступные диапазоны частоты дискретизации.

Float64	CAHALAudioDevice::GetNominalSampleRate() const
{
    Float64 theAnswer = 0;
    CAPropertyAddress theAddress(kAudioDevicePropertyNominalSampleRate);
    UInt32 theSize = sizeof(Float64);
    GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
    return theAnswer;
}

void	CAHALAudioDevice::SetNominalSampleRate(Float64 inSampleRate)
{
    CAPropertyAddress theAddress(kAudioDevicePropertyNominalSampleRate);
    SetPropertyData(theAddress, 0, NULL, sizeof(Float64), &inSampleRate);
}

UInt32	CAHALAudioDevice::GetNumberAvailableNominalSampleRateRanges() const
{
    UInt32 theAnswer = 0;
    CAPropertyAddress theAddress(kAudioDevicePropertyAvailableNominalSampleRates);
    if(HasProperty(theAddress))
    {
        UInt32 theSize = GetPropertyDataSize(theAddress, 0, NULL);
        theAnswer = theSize / sizeof(AudioValueRange);
    }
    return theAnswer;
}

void	CAHALAudioDevice::GetAvailableNominalSampleRateRanges(UInt32& ioNumberRanges, AudioValueRange* outRanges) const
{
    CAPropertyAddress theAddress(kAudioDevicePropertyAvailableNominalSampleRates);
    if(HasProperty(theAddress))
    {
        UInt32 theSize = ioNumberRanges * sizeof(AudioValueRange);
        GetPropertyData(theAddress, 0, NULL, theSize, outRanges);
        ioNumberRanges = theSize / sizeof(AudioValueRange);
    }
    else
    {
        ioNumberRanges = 0;
    }
}

Когда ввод имеет различную частоту дискретизации, чем вывод, существует два способа удовлетворить Вашим целям:

  1. Можно использовать AudioConverter для обработки преобразований частоты дискретизации между устройствами. AudioConverter может быть создан с потоковыми форматами ввода и вывода. Тогда необходимо использовать AudioConverterFillBuffer для преобразования буфера данных.

  2. Используйте DefaultOutputUnit. Это аудиоустройство обработает частоту дискретизации converstion между Вашим устройством ввода данных и устройством вывода по умолчанию автоматически. Посмотрите пример кода DefaultOutputUnit.



История версии документа


ДатаПримечания
22.07.2011

Передовая статья

09.12.2003

Новый документ, что, добираясь, устанавливая и преобразовывая частоты дискретизации с Аудиоустройствами.