I am having a problem when using AudioQueue to play PCM data. The volume is low when using the iPhone's speaker; I have even turned the system volume up to maximum. However, the volume is fine when I am using the earphones.
I inserted the data into the queue like this:
memcpy(mBuffers[mIndex]->mAudioData, pcmData, mBufferByteSize);
mBuffers[mIndex]->mAudioDataByteSize = mBufferByteSize;
mBuffers[mIndex]->mPacketDescriptionCount = mBufferByteSize/2;
OSStatus status = AudioQueueEnqueueBuffer(mQueue, mBuffers[mIndex], 0, NULL);
NSLog(@"fill audio queue buffer[%d]",mIndex);
if(mIndex == kNumberBuffers - 1) {
isStartPlay = YES;
mIndex = 0;
AudioQueueSetParameter(mQueue, kAudioQueueParam_Volume, 1.0);
status = AudioQueueStart(mQueue, NULL);
}else {
mIndex++;
}
I have set the volume like this:
AudioQueueSetParameter(mQueue, kAudioQueueParam_Volume, 1.0);
Are you using the AVAudioSessionCategoryPlayAndRecord
audio session category? If so, then you're probably playing back through the receiver, which is very quiet.
This bizarre default behaviour harks back to the days when play-and-record category was imagined to be useful mainly for VOIP apps, which, even more strangely, were banned from the AppStore.
To override playback through the normal speaker, try adding AVAudioSessionCategoryOptionDefaultToSpeaker
to your category options:
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];