diff --git a/Classes/Retronator/Xni/Framework/Audio/AudioEnums.h b/Classes/Retronator/Xni/Framework/Audio/AudioEnums.h new file mode 100644 index 0000000..a9fc886 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/AudioEnums.h @@ -0,0 +1,23 @@ +#import +#import + +typedef enum { + AudioChannelsMono = AL_FORMAT_MONO16, + AudioChannelsStereo = AL_FORMAT_STEREO16 +} AudioChannels; + +typedef enum { + AudioStopOptionsAsAuthored, + AudioStopOptionsImmediate +} AudioStopOptions; + +typedef enum { + MicrophoneStateStarted, + MicrophoneStateStopped +} MicrophoneState; + +typedef enum { + SoundStatePaused = AL_PAUSED, + SoundStatePlaying = AL_PLAYING, + SoundStateStopped = AL_STOPPED +} SoundState; \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Audio/Retronator.Xni.Framework.Audio.classes.h b/Classes/Retronator/Xni/Framework/Audio/Retronator.Xni.Framework.Audio.classes.h new file mode 100644 index 0000000..5939515 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/Retronator.Xni.Framework.Audio.classes.h @@ -0,0 +1,3 @@ +#import "AudioEnums.h" + +@class SoundEffect, SoundEffectInstance; \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Audio/Retronator.Xni.Framework.Audio.h b/Classes/Retronator/Xni/Framework/Audio/Retronator.Xni.Framework.Audio.h new file mode 100644 index 0000000..c4861f5 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/Retronator.Xni.Framework.Audio.h @@ -0,0 +1,4 @@ +#import "AudioEnums.h" + +#import "SoundEffect.h" +#import "SoundEffectInstance.h" \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Audio/SoundEffect+Internal.h b/Classes/Retronator/Xni/Framework/Audio/SoundEffect+Internal.h new file mode 100644 index 0000000..79afa93 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/SoundEffect+Internal.h @@ -0,0 +1,17 @@ +// +// SoundEffect+Internal.h +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import + +#import "SoundEffect.h" + +@interface SoundEffect (Internal) + ++ (void) update; + +@end diff --git a/Classes/Retronator/Xni/Framework/Audio/SoundEffect.h b/Classes/Retronator/Xni/Framework/Audio/SoundEffect.h new file mode 100644 index 0000000..f732f54 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/SoundEffect.h @@ -0,0 +1,49 @@ +// +// SoundEffect.h +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import +#import +#import + +#import "Retronator.Xni.Framework.Audio.classes.h" + +@interface SoundEffect : NSObject { +@private + NSData *buffer; + int offset; + int count; + int sampleRate; + AudioChannels channels; + int loopStart; + int loopLength; + NSString *name; + + NSUInteger bufferID; +} + +- (id) initWithBuffer:(NSData*)theBuffer sampleRate:(int)theSampleRate channels:(AudioChannels)theChannels; +- (id) initWithBuffer:(NSData*)theBuffer offset:(int)theOffset count:(int)theCount sampleRate:(int)theSampleRate channels:(AudioChannels)theChannels loopStart:(int)theLoopStart loopLength:(int)theLoopLength; + +@property (nonatomic, readonly) NSTimeInterval duration; +@property (nonatomic, retain) NSString *name; + ++ (float) speedOfSound; ++ (void) setSpeedOfSound:(float)value; + ++ (float) masterVolume; ++ (void) setMasterVolume:(float)value; + ++ (SoundEffect*) fromStream:(NSStream*)stream; ++ (NSTimeInterval) getSampleDurationForSizeInBytes:(int)sizeInBytes sampleRate:(int)sampleRate channels:(AudioChannels)channels; ++ (int) getSampleSizeInBytesForDuration:(NSTimeInterval)duration sampleRate:(int)sampleRate channels:(AudioChannels)channels; + +- (SoundEffectInstance*) createInstance; +- (BOOL) play; +- (BOOL) playWithVolume:(float)volume pitch:(float)pitch pan:(float)pan; + +@end diff --git a/Classes/Retronator/Xni/Framework/Audio/SoundEffect.m b/Classes/Retronator/Xni/Framework/Audio/SoundEffect.m new file mode 100644 index 0000000..bb347fc --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/SoundEffect.m @@ -0,0 +1,151 @@ +// +// SoundEffect.m +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import "SoundEffect.h" + +#import "Retronator.Xni.Framework.Audio.h" + +#import "SoundEffectInstance+Internal.h" + +@implementation SoundEffect + +static ALCdevice *audioDevice = nil; +static ALCcontext *audioContext = nil; + +static NSMutableArray *playingInstances; + +static float speedOfSound = 343.5; +static float masterVolume = 1; + ++ (void) initialize { + if (!audioDevice) { + // Initialization + audioDevice = alcOpenDevice(NULL); // select the "preferred device" + if (audioDevice) { + // use the device to make a context + audioContext=alcCreateContext(audioDevice,NULL); + // set my context to the currently active one + alcMakeContextCurrent(audioContext); + } + + playingInstances = [[NSMutableArray alloc] init]; + } +} + +- (id) initWithBuffer:(NSData*)theBuffer sampleRate:(int)theSampleRate channels:(AudioChannels)theChannels { + return [self initWithBuffer:theBuffer offset:0 count:[theBuffer length] sampleRate:theSampleRate channels:theChannels loopStart:0 loopLength:0]; +} + +- (id) initWithBuffer:(NSData*)theBuffer + offset:(int)theOffset + count:(int)theCount + sampleRate:(int)theSampleRate + channels:(AudioChannels)theChannels + loopStart:(int)theLoopStart + loopLength:(int)theLoopLength +{ + self = [super init]; + if (self != nil) { + buffer = theBuffer; + offset = theOffset; + count = theCount; + sampleRate = theSampleRate; + channels = theChannels; + loopStart = theLoopStart; + loopLength = theLoopLength; + + // Create an OpenAL buffer. + alGenBuffers(1, &bufferID); + alBufferData(bufferID, channels, [theBuffer bytes], [theBuffer length], theSampleRate); + } + return self; +} + +@synthesize duration, name; + ++ (float) speedOfSound { + return speedOfSound; +} + ++ (void) setSpeedOfSound:(float)value { + speedOfSound = value; + alSpeedOfSound(speedOfSound); +} + ++ (float) masterVolume { + return masterVolume; +} + ++ (void) setMasterVolume:(float)value { + masterVolume = value; + alListenerf(AL_GAIN, masterVolume); +} + ++ (SoundEffect*) fromStream:(NSStream*)stream { + return nil; +} + ++ (int) getSecondInBytesForSampleRate:(int)sampleRate channels:(AudioChannels)channels { + int secondInBytes = sampleRate; + + // 16 bits per sample = 2 bytes per sample. + secondInBytes *= 2; + + // Multiply with number of channels. + if (channels == AudioChannelsStereo) { + secondInBytes *= 2; + } + + return secondInBytes; +} + ++ (NSTimeInterval) getSampleDurationForSizeInBytes:(int)sizeInBytes sampleRate:(int)sampleRate channels:(AudioChannels)channels { + return (double)sizeInBytes / (double)[SoundEffect getSecondInBytesForSampleRate:sampleRate channels:channels]; +} + ++ (int) getSampleSizeInBytesForDuration:(NSTimeInterval)duration sampleRate:(int)sampleRate channels:(AudioChannels)channels { + return (int)(duration * [SoundEffect getSecondInBytesForSampleRate:sampleRate channels:channels]); +} + ++ (void) update { + int i=0; + while (i<[playingInstances count]) { + SoundEffectInstance *instance = [playingInstances objectAtIndex:i]; + if (instance.state == SoundStateStopped) { + [playingInstances removeObjectAtIndex:i]; + } else { + i++; + } + } +} + +- (SoundEffectInstance *) createInstance { + return [[[SoundEffectInstance alloc] initWithBufferID:bufferID] autorelease]; +} + +- (BOOL) play { + return [self playWithVolume:1 pitch:0 pan:0]; +} + +- (BOOL) playWithVolume:(float)volume pitch:(float)pitch pan:(float)pan { + SoundEffectInstance *instance = [self createInstance]; + [playingInstances addObject:instance]; + instance.volume = volume; + instance.pitch = pitch; + instance.pan = pan; + [instance play]; + return YES; +} + +- (void) dealloc +{ + alDeleteBuffers(1, &bufferID); + [super dealloc]; +} + +@end diff --git a/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance+Internal.h b/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance+Internal.h new file mode 100644 index 0000000..3872cf1 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance+Internal.h @@ -0,0 +1,16 @@ +// +// SoundEffectInstance+Internal.h +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import + + +@interface SoundEffectInstance (Internal) + +- (id) initWithBufferID:(NSUInteger)bufferID; + +@end diff --git a/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance.h b/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance.h new file mode 100644 index 0000000..8339f72 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance.h @@ -0,0 +1,32 @@ +// +// SoundEffectInstance.h +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import +#import +#import + +#import "Retronator.Xni.Framework.Audio.classes.h" + +@interface SoundEffectInstance : NSObject { +@private + BOOL isLooped; + float pan, pitch, volume; + NSUInteger sourceID; +} + +@property (nonatomic) BOOL isLooped; +@property (nonatomic, readonly) SoundState state; +@property (nonatomic) float pan, pitch, volume; + +- (void) play; +- (void) pause; +- (void) resume; +- (void) stop; +- (void) stopImmediate:(BOOL)immediate; + +@end diff --git a/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance.m b/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance.m new file mode 100644 index 0000000..6c307be --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Audio/SoundEffectInstance.m @@ -0,0 +1,91 @@ +// +// SoundEffectInstance.m +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import "SoundEffectInstance.h" +#import "SoundEffectInstance+Internal.h" + +@implementation SoundEffectInstance + +- (id) initWithBufferID:(NSUInteger)bufferID +{ + self = [super init]; + if (self != nil) { + // grab a source ID from openAL + alGenSources(1, &sourceID); + + // attach the buffer to the source + alSourcei(sourceID, AL_BUFFER, bufferID); + + // set some basic source prefs + alSourcef(sourceID, AL_PITCH, 1.0f); + alSourcef(sourceID, AL_GAIN, 1.0f); + } + return self; +} + +@synthesize isLooped, pan, pitch, volume; + +- (void) setIsLooped:(BOOL)value { + isLooped = value; + alSourcei(sourceID, AL_LOOPING, isLooped); +} + +- (SoundState) state { + ALenum state; + alGetSourcei(sourceID, AL_SOURCE_STATE, &state); + return state; +} + +- (void) setPan:(float)value { + pan = value; + alSource3f(sourceID, AL_POSITION, pan, 0, 0); +} + +- (void) setPitch:(float)value { + pitch = value; + float alPitch = pow(2, value); + alSourcef(sourceID, AL_PITCH, alPitch); +} + +- (void) setVolume:(float)value { + volume = value; + alSourcef(sourceID, AL_GAIN, volume); +} + +- (void) play { + alSourcePlay(sourceID); +} + + +- (void) pause { + alSourcePause(sourceID); +} + + +- (void) resume { + alSourcePlay(sourceID); +} + +- (void) stop { + [self stopImmediate:YES]; +} + +- (void) stopImmediate:(BOOL)immediate { + if (immediate) { + alSourceStop(sourceID); + } +} + +- (void) dealloc +{ + alDeleteSources(1, &sourceID); + [super dealloc]; +} + + +@end diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContent.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContent.h new file mode 100644 index 0000000..5f5243f --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContent.h @@ -0,0 +1,40 @@ +// +// AudioContent.h +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import + +#import "Retronator.Xni.Framework.Content.Pipeline.Audio.classes.h" + +#import "ContentItem.h" + +@interface AudioContent : ContentItem { + NSTimeInterval duration; + NSString *fileName; + AudioFileType fileType; + AudioFormat *format; + int loopLength; + int loopStart; + +@private + NSURL *fileUrl; + ExtAudioFileRef extRef; +} + +- (id) initWithAudioFileName:(NSString*)theFileName audioFileType:(AudioFileType)theFileType; + +@property (nonatomic, readonly) NSData *data; +@property (nonatomic, readonly) NSTimeInterval duration; +@property (nonatomic, readonly) NSString *fileName; +@property (nonatomic, readonly) AudioFileType fileType; +@property (nonatomic, readonly) AudioFormat *format; +@property (nonatomic, readonly) int loopLength; +@property (nonatomic, readonly) int loopStart; + +- (void) convertFormatTo:(ConversionFormat)formatType quality:(ConversionQuality)quality targetFileName:(NSString*)targetFileName; + +@end diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContent.m b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContent.m new file mode 100644 index 0000000..7387466 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContent.m @@ -0,0 +1,119 @@ +// +// AudioContent.m +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import "AudioContent.h" + +#import "Retronator.Xni.Framework.Content.Pipeline.Audio.h" + +@implementation AudioContent + +- (id) initWithAudioFileName:(NSString *)theFileName audioFileType:(AudioFileType)theFileType +{ + self = [super init]; + if (self != nil) { + fileName = theFileName; + fileType = theFileType; + + // Load file. + OSStatus err = noErr; + AudioStreamBasicDescription theFileFormat; + UInt32 thePropertySize = sizeof(theFileFormat); + + // Open a file with ExtAudioFileOpen(). + fileUrl = [[NSURL fileURLWithPath:theFileName] retain]; + extRef = nil; + err = ExtAudioFileOpenURL((CFURLRef)fileUrl, &extRef); + if (err) { + [NSException raise:@"NotSupportedException" format:@"ExtAudioFileOpenURL FAILED, Error = %ld\n", err]; + } + + // Get the audio data format. + err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &theFileFormat); + if (err) { + [NSException raise:@"NotSupportedException" format:@"ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error = %ld\n", err]; + } + + format = [[AudioFormat alloc] initWithDescription:theFileFormat]; + } + return self; +} + +@synthesize duration, fileName, fileType, format, loopLength, loopStart; + +- (NSData *) data { + // Get the total frame count + void* theData = NULL; + SInt64 theFileLengthInFrames = 0; + UInt32 thePropertySize = sizeof(theFileLengthInFrames); + OSStatus err = noErr; + err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileLengthFrames, &thePropertySize, &theFileLengthInFrames); + if (err) { + [NSException raise:@"NotSupportedException" format:@"MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileLengthFrames) FAILED, Error = %ld\n", err]; + } + + duration = (double)theFileLengthInFrames / (double)format.sampleRate; + + // Read all the data into memory + UInt32 dataSize = theFileLengthInFrames * format.nativeWaveFormat.mBytesPerFrame; + + theData = malloc(dataSize); + if (theData) + { + AudioBufferList theDataBuffer; + theDataBuffer.mNumberBuffers = 1; + theDataBuffer.mBuffers[0].mDataByteSize = dataSize; + theDataBuffer.mBuffers[0].mNumberChannels = format.nativeWaveFormat.mChannelsPerFrame; + theDataBuffer.mBuffers[0].mData = theData; + + // Read the data into an AudioBufferList + err = ExtAudioFileRead(extRef, (UInt32*)&theFileLengthInFrames, &theDataBuffer); + if (err) { + // failure + [NSException raise:@"NotSupportedException" format:@"MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n", err]; + } + } + + NSData *result = [NSData dataWithBytes:theData length:dataSize]; + free(theData); + return result; +} + +- (void) convertFormatTo:(ConversionFormat)formatType quality:(ConversionQuality)quality targetFileName:(NSString *)targetFileName { + AudioStreamBasicDescription theOutputFormat; + + // 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 = format.nativeWaveFormat.mSampleRate; + theOutputFormat.mChannelsPerFrame = format.nativeWaveFormat.mChannelsPerFrame; + + theOutputFormat.mFormatID = formatType; + 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 + OSStatus err = noErr; + err = ExtAudioFileSetProperty(extRef, kExtAudioFileProperty_ClientDataFormat, sizeof(theOutputFormat), &theOutputFormat); + if (err) { + [NSException raise:@"NotSupportedException" format:@"MyGetOpenALAudioData: ExtAudioFileSetProperty(kExtAudioFileProperty_ClientDataFormat) FAILED, Error = %ld\n", err]; + } + + [format release]; + format = [[AudioFormat alloc] initWithDescription:theOutputFormat]; +} + +- (void) dealloc +{ + //if (extRef) ExtAudioFileDispose(extRef); + [fileUrl release]; + [super dealloc]; +} + +@end diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContentEnums.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContentEnums.h new file mode 100644 index 0000000..fe226ed --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioContentEnums.h @@ -0,0 +1,20 @@ +#import + +typedef enum { + AudioFileTypeMp3, + AudioFileTypeWav, +// AudioFileTypeWma, +} AudioFileType; + +typedef enum { + ConversionFormatAdpcm = kAudioFormatAppleIMA4, + ConversionFormatPcm = kAudioFormatLinearPCM, +// ConversionFormatWindowsMedia, +// ConversionFormatXma, +} ConversionFormat; + +typedef enum { + ConversionQualityLow, + ConversionQualityMedium, + ConversionQualityBest, +} ConversionQuality; \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioFormat.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioFormat.h new file mode 100644 index 0000000..26f59ca --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioFormat.h @@ -0,0 +1,33 @@ +// +// AudioFormat.h +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import + +#import + +@interface AudioFormat : NSObject { + int averageBytesPerSecond; + int bitsPerSample; + int blockAlign; + int channelCount; + int format; + AudioStreamBasicDescription nativeWaveFormat; + int sampleRate; +} + +- (id) initWithDescription:(AudioStreamBasicDescription)description; + +@property (nonatomic, readonly) int averageBytesPerSecond; +@property (nonatomic, readonly) int bitsPerSample; +@property (nonatomic, readonly) int blockAlign; +@property (nonatomic, readonly) int channelCount; +@property (nonatomic, readonly) int format; +@property (nonatomic, readonly) AudioStreamBasicDescription nativeWaveFormat; +@property (nonatomic, readonly) int sampleRate; + +@end diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioFormat.m b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioFormat.m new file mode 100644 index 0000000..c4766e4 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/AudioFormat.m @@ -0,0 +1,31 @@ +// +// AudioFormat.m +// XNI +// +// Created by Matej Jan on 15.12.10. +// Copyright 2010 Retronator. All rights reserved. +// + +#import "AudioFormat.h" + + +@implementation AudioFormat + +- (id) initWithDescription:(AudioStreamBasicDescription)description { + self = [super init]; + if (self != nil) { + averageBytesPerSecond = description.mSampleRate * description.mBytesPerFrame; + bitsPerSample = description.mBitsPerChannel; + blockAlign = description.mBytesPerFrame; + channelCount = description.mChannelsPerFrame; + format = description.mFormatID; + nativeWaveFormat = description; + sampleRate = description.mSampleRate; + } + return self; +} + +@synthesize averageBytesPerSecond, bitsPerSample, blockAlign, channelCount, format, nativeWaveFormat, sampleRate; + + +@end diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/Retronator.Xni.Framework.Content.Pipeline.Audio.classes.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/Retronator.Xni.Framework.Content.Pipeline.Audio.classes.h new file mode 100644 index 0000000..fedb43e --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/Retronator.Xni.Framework.Content.Pipeline.Audio.classes.h @@ -0,0 +1,3 @@ +#import "AudioContentEnums.h" + +@class AudioContent, AudioFormat; \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/Retronator.Xni.Framework.Content.Pipeline.Audio.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/Retronator.Xni.Framework.Content.Pipeline.Audio.h new file mode 100644 index 0000000..5e03740 --- /dev/null +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Audio/Retronator.Xni.Framework.Content.Pipeline.Audio.h @@ -0,0 +1,4 @@ +#import "AudioContentEnums.h" + +#import "AudioContent.h" +#import "AudioFormat.h" \ No newline at end of file