我相信你已經解決了這個問題,但對於那些通過Google發現這個問題的人來說,這裏是一些幾乎沒有經過測試的WAV加載代碼。它的工作原理,但你最好仔細檢查內存泄漏,以及在使用真正的東西之前。
static bool LoadWAVFile(const char* filename, ALenum* format, ALvoid** data, ALsizei* size, ALsizei* freq, Float64* estimatedDurationOut)
{
CFStringRef filenameStr = CFStringCreateWithCString(NULL, filename, kCFStringEncodingUTF8);
CFURLRef url = CFURLCreateWithFileSystemPath(NULL, filenameStr, kCFURLPOSIXPathStyle, false);
CFRelease(filenameStr);
AudioFileID audioFile;
OSStatus error = AudioFileOpenURL(url, kAudioFileReadPermission, kAudioFileWAVEType, &audioFile);
CFRelease(url);
if (error != noErr)
{
fprintf(stderr, "Error opening audio file. %d\n", error);
return false;
}
AudioStreamBasicDescription basicDescription;
UInt32 propertySize = sizeof(basicDescription);
error = AudioFileGetProperty(audioFile, kAudioFilePropertyDataFormat, &propertySize, &basicDescription);
if (error != noErr)
{
fprintf(stderr, "Error reading audio file basic description. %d\n", error);
AudioFileClose(audioFile);
return false;
}
if (basicDescription.mFormatID != kAudioFormatLinearPCM)
{
// Need PCM for Open AL. WAVs are (I believe) by definition PCM, so this check isn't necessary. It's just here
// in case I ever use this with another audio format.
fprintf(stderr, "Audio file is not linear-PCM. %d\n", basicDescription.mFormatID);
AudioFileClose(audioFile);
return false;
}
UInt64 audioDataByteCount = 0;
propertySize = sizeof(audioDataByteCount);
error = AudioFileGetProperty(audioFile, kAudioFilePropertyAudioDataByteCount, &propertySize, &audioDataByteCount);
if (error != noErr)
{
fprintf(stderr, "Error reading audio file byte count. %d\n", error);
AudioFileClose(audioFile);
return false;
}
Float64 estimatedDuration = 0;
propertySize = sizeof(estimatedDuration);
error = AudioFileGetProperty(audioFile, kAudioFilePropertyEstimatedDuration, &propertySize, &estimatedDuration);
if (error != noErr)
{
fprintf(stderr, "Error reading estimated duration of audio file. %d\n", error);
AudioFileClose(audioFile);
return false;
}
ALenum alFormat = 0;
if (basicDescription.mChannelsPerFrame == 1)
{
if (basicDescription.mBitsPerChannel == 8)
alFormat = AL_FORMAT_MONO8;
else if (basicDescription.mBitsPerChannel == 16)
alFormat = AL_FORMAT_MONO16;
else
{
fprintf(stderr, "Expected 8 or 16 bits for the mono channel but got %d\n", basicDescription.mBitsPerChannel);
AudioFileClose(audioFile);
return false;
}
}
else if (basicDescription.mChannelsPerFrame == 2)
{
if (basicDescription.mBitsPerChannel == 8)
alFormat = AL_FORMAT_STEREO8;
else if (basicDescription.mBitsPerChannel == 16)
alFormat = AL_FORMAT_STEREO16;
else
{
fprintf(stderr, "Expected 8 or 16 bits per channel but got %d\n", basicDescription.mBitsPerChannel);
AudioFileClose(audioFile);
return false;
}
}
else
{
fprintf(stderr, "Expected 1 or 2 channels in audio file but got %d\n", basicDescription.mChannelsPerFrame);
AudioFileClose(audioFile);
return false;
}
UInt32 numBytesToRead = audioDataByteCount;
void* buffer = malloc(numBytesToRead);
if (buffer == NULL)
{
fprintf(stderr, "Error allocating buffer for audio data of size %u\n", numBytesToRead);
return false;
}
error = AudioFileReadBytes(audioFile, false, 0, &numBytesToRead, buffer);
AudioFileClose(audioFile);
if (error != noErr)
{
fprintf(stderr, "Error reading audio bytes. %d\n", error);
free(buffer);
return false;
}
if (numBytesToRead != audioDataByteCount)
{
fprintf(stderr, "Tried to read %lld bytes from the audio file but only got %d bytes\n", audioDataByteCount, numBytesToRead);
free(buffer);
return false;
}
*freq = basicDescription.mSampleRate;
*size = audioDataByteCount;
*format = alFormat;
*data = buffer;
*estimatedDurationOut = estimatedDuration;
return true;
}
更多的數據點:(1)「的grep -RF alutLoadWAVFile /系統/庫/框架/開發商/軟件開發工具包的/ usr /包括--include = '* H'。」不發出輸出並返回退出狀態1 (沒有結果)。 (2)項目沒有打開丟失原型的警告;我打開了它,並得到了四個警告,其中沒有一個是alutLoadWAVFile。 (3)修改build文件夾只會打開.o文件,最終的可執行文件和Xcode的索引文件。 先生,你發現了一個謎。 – 2009-04-30 07:29:17