如何使用AudioUnit静音麦克风输入音量?

时间:2014-08-11 14:36:12

标签: ios objective-c audiounit

我使用AudioUnits录制和播放声音。它是软电话的一部分。

这是我的初始化:

AudioStreamBasicDescription audioFormat;
    audioFormat.mSampleRate = 8000;
    audioFormat.mFormatID = kAudioFormatULaw;
    audioFormat.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
    audioFormat.mFramesPerPacket = 1;
    audioFormat.mChannelsPerFrame = 1;
    audioFormat.mBitsPerChannel = 16;
    audioFormat.mBytesPerPacket = 2;
    audioFormat.mBytesPerFrame = 2;

status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, kInputBus, &audioFormat, sizeof(audioFormat));

AURenderCallbackStruct callbackStruct;
    callbackStruct.inputProc = recordingCallback;
    callbackStruct.inputProcRefCon = (__bridge void *)(self);
    status = AudioUnitSetProperty(audioUnit,
                                  kAudioOutputUnitProperty_SetInputCallback,
                                  kAudioUnitScope_Global,
                                  kInputBus,
                                  &callbackStruct,
                                  sizeof(callbackStruct));

在录制过程中,我使用回调来处理声音:

static OSStatus recordingCallback(void *inRefCon,
                                  AudioUnitRenderActionFlags *ioActionFlags,
                                  const AudioTimeStamp *inTimeStamp,
                                  UInt32 inBusNumber,
                                  UInt32 inNumberFrames,
                                  AudioBufferList *ioData)

现在在某些时候我想把麦克风静音。谷歌搜索后,我发现这是一个解决方案:

-(void) setMuteOn {
    AudioUnitParameterValue volume = 0.0;
    AudioUnitSetProperty(audioUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, 1, &volume, 0);
}

但它不起作用。也许我需要对我的audioUnit做一些更新,我不知道。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

实际上它比我想象的容易。在回调方法中,我只是用静音覆盖了那些声音缓冲区。在我的情况下,我使用的是ULAW压缩,所以只用0xFF

填充我的数组

麦克风仍在录制,但我停止使用数据。

答案 1 :(得分:0)

你可以做以下我觉得有点清洁。

<div class="grid9 red"
ng-click="myNavigatorHome.pushPage('Test.html',{ animation : 'slide' });
myFunction()">test</div>