объектив с аудио метр - PullRequest
1 голос
/ 03 июля 2010

Возможно ли для xcode иметь индикатор уровня звука?

Я хочу сделать что-то вроде этого:

if (audioLevel = 100) {
}

или что-то подобное ...

Есть идеи?Пример кода, пожалуйста?

Я ОЧЕНЬ новичок в цели c, поэтому более подробно объясняю, как лучше!: D

1 Ответ

6 голосов
/ 04 июля 2010

К сожалению, нет очень простого API для этого.Вам нужно использовать низкий уровень AudioToolbox.framework .

К счастью, другие уже решили эту проблему для вас.Вот некоторый код, который я немного упростил, чтобы быть прямыми функциями C, из CocoaDev .Вам нужно связаться с AudioToolbox, чтобы скомпилировать этот код ( см. Здесь документацию о том, как это сделать ).

#import <AudioToolbox/AudioServices.h>

AudioDeviceID getDefaultOutputDeviceID()
{
    AudioDeviceID outputDeviceID = kAudioObjectUnknown;

    // get output device device
    OSStatus status = noErr;
    AudioObjectPropertyAddress propertyAOPA;
    propertyAOPA.mScope = kAudioObjectPropertyScopeGlobal;
    propertyAOPA.mElement = kAudioObjectPropertyElementMaster;
    propertyAOPA.mSelector = kAudioHardwarePropertyDefaultOutputDevice;

    if (!AudioHardwareServiceHasProperty(kAudioObjectSystemObject, &propertyAOPA))
    {
        printf("Cannot find default output device!");
        return outputDeviceID;
    }

    status = AudioHardwareServiceGetPropertyData(kAudioObjectSystemObject, &propertyAOPA, 0, NULL, (UInt32[]){sizeof(AudioDeviceID)}, &outputDeviceID);

    if (status != 0) 
    {
        printf("Cannot find default output device!");
    }
    return outputDeviceID;
}

float getVolume () 
{
    Float32 outputVolume;

    OSStatus status = noErr;
    AudioObjectPropertyAddress propertyAOPA;
    propertyAOPA.mElement = kAudioObjectPropertyElementMaster;
    propertyAOPA.mSelector = kAudioHardwareServiceDeviceProperty_VirtualMasterVolume;
    propertyAOPA.mScope = kAudioDevicePropertyScopeOutput;

    AudioDeviceID outputDeviceID = getDefaultOutputDeviceID();

    if (outputDeviceID == kAudioObjectUnknown)
    {
        printf("Unknown device");
        return 0.0;
    }

    if (!AudioHardwareServiceHasProperty(outputDeviceID, &propertyAOPA))
    {
        printf("No volume returned for device 0x%0x", outputDeviceID);
        return 0.0;
    }

    status = AudioHardwareServiceGetPropertyData(outputDeviceID, &propertyAOPA, 0, NULL, (UInt32[]){sizeof(Float32)}, &outputVolume);

    if (status)
    {
        printf("No volume returned for device 0x%0x", outputDeviceID);
        return 0.0;
    }

    if (outputVolume < 0.0 || outputVolume > 1.0) return 0.0;

    return outputVolume;
}

int main (int argc, char const *argv[])
{
    printf("%f", getVolume());
    return 0;
}

Обратите внимание, что там также есть функция setVolume.1012 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...