[Openal-devel] Get part of a source / buffer

Niall09 niallb.08 at gmail.com
Mon May 25 10:33:25 PDT 2009



Chris Robinson-5 wrote:
> 
> How are you setting the frames/channels/freq/data variables?
> 

For the channels: channels = AL_FORMAT_STEREO16;

For the frames, freq and data: data = getOpenALAudioData(fileURL, &size3,
&format3, &freq,&frames);

void* getOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum
*outDataFormat, ALuint* outSampleRate,ALuint * frames)
{
	OSStatus err = noErr;
	SInt64 theFileLengthInFrames = 0;
	AudioStreamBasicDescription theFileFormat;
	UInt32 thePropertySize = sizeof(theFileFormat);
	printf("\nT: %i : %d \n",sizeof(theFileFormat),sizeof(theFileFormat));
	ExtAudioFileRef extRef = NULL;
	void* theData = NULL;
	AudioStreamBasicDescription theOutputFormat;
	
	// Open a file with ExtAudioFileOpen()
	err = ExtAudioFileOpenURL(inFileURL, &extRef);
	if(err) { printf("MyGetOpenALAudioData: ExtAudioFileOpenURL FAILED, Error =
%ld\n", err); goto Exit; }
	
	// Get the audio data format
	err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat,
&thePropertySize, &theFileFormat);
	if(err) { printf("MyGetOpenALAudioData:
ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error
= %ld\n", err); goto Exit; }
	if (theFileFormat.mChannelsPerFrame > 2)  { printf("MyGetOpenALAudioData -
Unsupported Format, channel count is greater than stereo\n"); goto Exit;}
	
	// Set the client format to 16 bit signed integer (native-endian) data
	// Maintain the channel count and sample rate of the original source format
	theOutputFormat.mSampleRate = theFileFormat.mSampleRate;
	theOutputFormat.mChannelsPerFrame = theFileFormat.mChannelsPerFrame;
	
	theOutputFormat.mFormatID = kAudioFormatLinearPCM;
	theOutputFormat.mBytesPerPacket = 2 * theOutputFormat.mChannelsPerFrame;
	theOutputFormat.mFramesPerPacket = 1;
	theOutputFormat.mBytesPerFrame = 2 * theOutputFormat.mChannelsPerFrame;
	theOutputFormat.mBitsPerChannel = 16;
	theOutputFormat.mFormatFlags = kAudioFormatFlagsNativeEndian |
kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
	
	// Set the desired client (output) data format
	err = ExtAudioFileSetProperty(extRef,
kExtAudioFileProperty_ClientDataFormat, sizeof(theOutputFormat),
&theOutputFormat);
	if(err) { printf("MyGetOpenALAudioData:
ExtAudioFileSetProperty(kExtAudioFileProperty_ClientDataFormat) FAILED,
Error = %ld\n", err); goto Exit; }
	
	// Get the total frame count
	thePropertySize = sizeof(theFileLengthInFrames);
	//AL_SAMPLE
	err = ExtAudioFileGetProperty(extRef,
kExtAudioFileProperty_FileLengthFrames, &thePropertySize,
&theFileLengthInFrames);
	if(err) { printf("MyGetOpenALAudioData:
ExtAudioFileGetProperty(kExtAudioFileProperty_FileLengthFrames) FAILED,
Error = %ld\n", err); goto Exit; }
	
	// Read all the data into memory
	UInt32		dataSize = theFileLengthInFrames * theOutputFormat.mBytesPerFrame;
	theData = malloc(dataSize);
	*frames = theFileLengthInFrames;
	if (theData)
	{
		AudioBufferList		theDataBuffer;
		theDataBuffer.mNumberBuffers = 1;
		theDataBuffer.mBuffers[0].mDataByteSize = dataSize;
		theDataBuffer.mBuffers[0].mNumberChannels =
theOutputFormat.mChannelsPerFrame;
		theDataBuffer.mBuffers[0].mData = theData;
		
		// Read the data into an AudioBufferList
		err = ExtAudioFileRead(extRef, (UInt32*)&theFileLengthInFrames,
&theDataBuffer);
		if(err == noErr)
		{
			// success
			*outDataSize = (ALsizei)dataSize;
			*outDataFormat = (theOutputFormat.mChannelsPerFrame > 1) ?
AL_FORMAT_STEREO16 : AL_FORMAT_MONO16;
			*outSampleRate = (ALsizei)theOutputFormat.mSampleRate;
		}
		else
		{
			// failure
			free (theData);
			theData = NULL; // make sure to return NULL
			printf("MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n",
err); goto Exit;
		}
	}
	
Exit:
	// Dispose the ExtAudioFileRef, it is no longer needed
	if (extRef) ExtAudioFileDispose(extRef);
	return theData;
}
-- 
View this message in context: http://www.nabble.com/Get-part-of-a-source---buffer-tp23693533p23710503.html
Sent from the OpenAL - Dev mailing list archive at Nabble.com.



More information about the Openal-devel mailing list