, , , () :
: setInputGain AVAudioSession.
- (BOOL)setInputGain:(float)gain error:(NSError **)outError NS_AVAILABLE_IOS(6_0);
@property(readonly) float inputGain NS_AVAILABLE_IOS(6_0);
, , , AVAudioSession, AudioUnit, OpenAL ..
, AudioUnit, AUGraph :
AudioComponentDescription MixerUnitDescription;
MixerUnitDescription.componentType = kAudioUnitType_Mixer;
MixerUnitDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer;
MixerUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
MixerUnitDescription.componentFlags = 0;
MixerUnitDescription.componentFlagsMask = 0;
err = AUGraphAddNode (processingGraph, &MixerUnitDescription, &mixerNode );
if (err) { NSLog(@"mixerNode err = %d", (int)err); return NO; }
- (void)setOutputVolume:(AudioUnitParameterValue)value
{
OSStatus result;
result = AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Output, 0, value, 0);
if (result) {
NSLog(@"AudioUnitSetParameter kMultiChannelMixerParam_Volume Output result %d %08X %4.4s\n", (int)result, (unsigned int)result, (char*)&result);
return;
}
}
, AUGraph
RemoteIO
-------------------------
| i o |
-- BUS 1 -- from mic --> | n REMOTE I/O u | -- BUS 1 -- to app -->
| p AUDIO t |
-- BUS 0 -- from app --> | u UNIT p | -- BUS 0 -- to speaker -->
| t u |
| t |
-------------------------
, , :
- (void)setInputVolume:(UInt32)inputBus value:(AudioUnitParameterValue)value
{
micGainLevel = value;
OSStatus result;
result = AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, inputBus, value, 0);
if (result) {
NSLog(@"AudioUnitSetParameter kMultiChannelMixerParam_Volume Input result %d %08X %4.4s\n", (int)result, (unsigned int)result, (char*)&result);
}
}
, WAV, , :
WavInFile *inFile = new WavInFile( cString );
float samplerate = (int)(*inFile).getSampleRate();
int nChannels = (int)(*inFile).getNumChannels();
float nSamples = (*inFile).getNumSamples();
float duration = (double)(*inFile).getLengthMS() / (double) 1000;
while (inFile->eof() == 0) {
int num, samples;
num = inFile->read(shortBuffer, BUFF_SIZE);
samples = num / nChannels;
seconds = (double)(*inFile).getElapsedMS() / (double) 1000;
float currentFrequency = 0.0f;
SInt16ToDouble(shortBuffer, doubleBuffer, samples);
currentFrequency = dywapitch_computepitch(&(pitchtrackerFile), doubleBuffer, 0, samples);
currentFrequency = samplerate / (float)44100.0f * currentFrequency;
}
short amplifyPCMSInt16(int value, int dbGain, bool clampValue) {
int newValue = (int) ( pow(2.0, ((double)dbGain)/6.014 )*value);
if(clampValue){
if(newValue>32767)
newValue = 32767;
else if(newValue < -32768 )
newValue = -32768;
}
return (short) newValue;
}
, EOF, , , AURenderCallbackStruct, , msec:
AURenderCallbackStruct lineInrCallbackStruct = {};
lineInrCallbackStruct.inputProc = &micLineInCallback;
lineInrCallbackStruct.inputProcRefCon = (void*)self;
err = AudioUnitSetProperty(
vfxUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
0,
&lineInrCallbackStruct,
sizeof(lineInrCallbackStruct));
static OSStatus micLineInCallback (void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
}
:
SInt16 *sampleBufferLeft = THIS.conversionBufferLeft;
SInt16 *sampleBufferRight = THIS.conversionBufferRight;
SInt16 *sampleBuffer;
double *doubleBuffer = THIS.doubleBufferMono;
inSamplesLeft = (SInt32 *) ioData->mBuffers[0].mData;
fixedPointToSInt16(inSamplesLeft, sampleBufferLeft, inNumberFrames);
if(isStereo) {
inSamplesRight = (SInt32 *) ioData->mBuffers[1].mData;
fixedPointToSInt16(inSamplesRight, sampleBufferRight, inNumberFrames);
for( i = 0; i < inNumberFrames; i++ ) {
sampleBufferLeft[i] = (SInt16) ((.5 * (float) sampleBufferLeft[i]) + (.5 * (float) sampleBufferRight[i]));
}
}
( ), L-R, , amplifyPCMSInt16.