From 2f0bc9f91ab096881ea07eda65c0c176199a226a Mon Sep 17 00:00:00 2001 From: Matej Jan Date: Wed, 15 Dec 2010 08:51:44 +0000 Subject: [PATCH] SoundEffect support implemented. git-svn-id: http://xni.googlecode.com/svn/XNI@49 ac433895-eea3-a490-d80a-17149a75e588 --- .../Xni/Framework/Content/ContentManager.m | 31 ++++++++++++++----- .../Content/ContentTypeReaderManager.h | 1 + .../Content/ContentTypeReaderManager.m | 3 ++ ...r.Xni.Framework.Content.Pipeline.classes.h | 2 ++ ...etronator.Xni.Framework.Content.Pipeline.h | 2 ++ .../Content/Pipeline/TextureImporter.h | 4 --- ...Retronator.Xni.Framework.Content.classes.h | 3 +- .../Retronator.Xni.Framework.Content.h | 4 ++- Classes/Retronator/Xni/Framework/Game.m | 12 ++++--- Classes/Retronator/Xni/Framework/GameHost.m | 1 - 10 files changed, 44 insertions(+), 19 deletions(-) diff --git a/Classes/Retronator/Xni/Framework/Content/ContentManager.m b/Classes/Retronator/Xni/Framework/Content/ContentManager.m index 75d71b8..7f82a26 100644 --- a/Classes/Retronator/Xni/Framework/Content/ContentManager.m +++ b/Classes/Retronator/Xni/Framework/Content/ContentManager.m @@ -12,6 +12,7 @@ #import "Retronator.Xni.Framework.Content.h" #import "Retronator.Xni.Framework.Content.Pipeline.h" #import "Retronator.Xni.Framework.Content.Pipeline.Processors.h" +#import "Retronator.Xni.Framework.Content.Pipeline.Audio.h" @implementation ContentManager @@ -89,21 +90,35 @@ // Compare lowercase extension. extension = [extension lowercaseString]; - if ([extension isEqual:@"png"] || [extension isEqual:@"jpg"] || [extension isEqual:@"jpeg"] || - [extension isEqual:@"gif"] || [extension isEqual:@"tif"] || [extension isEqual:@"tiff"] || - [extension isEqual:@"ico"] || [extension isEqual:@"bmp"]) { - // We have texture content + if ([extension isEqualToString:@"png"] || [extension isEqualToString:@"jpg"] || [extension isEqualToString:@"jpeg"] || + [extension isEqualToString:@"gif"] || [extension isEqualToString:@"tif"] || [extension isEqualToString:@"tiff"] || + [extension isEqualToString:@"ico"] || [extension isEqualToString:@"bmp"]) { + // Texture content TextureImporter *textureImporter = [[[TextureImporter alloc] init] autorelease]; TextureContent *textureContent = [textureImporter importFile:absolutePath]; input = [[ContentReader alloc] initWithContentManager:self Content:textureContent]; - } else if ([extension isEqual:@"x"]) { - // We have direct x model content + } else if ([extension isEqualToString:@"x"]) { + // Direct x model content XImporter *xImporter = [[[XImporter alloc] init] autorelease]; NodeContent *root = [xImporter importFile:absolutePath]; ModelProcessor *modelProcessor = [[[ModelProcessor alloc] init] autorelease]; ModelContent *modelContent = [modelProcessor process:root]; input = [[ContentReader alloc] initWithContentManager:self Content:modelContent]; + } else if ([extension isEqualToString:@"wav"]) { + // Wave audio content + WavImporter *wavImporter = [[[WavImporter alloc] init] autorelease]; + AudioContent *audioContent = [wavImporter importFile:absolutePath]; + SoundEffectProcessor *soundEffectProcessor = [[[SoundEffectProcessor alloc] init] autorelease]; + SoundEffectContent *soundEffectContent = [soundEffectProcessor process:audioContent]; + input = [[ContentReader alloc] initWithContentManager:self Content:soundEffectContent]; + } else if ([extension isEqualToString:@"mp3"]) { + // Wave audio content + WavImporter *wavImporter = [[[WavImporter alloc] init] autorelease]; + AudioContent *audioContent = [wavImporter importFile:absolutePath]; + SongProcessor *songProcessor = [[[SongProcessor alloc] init] autorelease]; + SongContent *songContent = [songProcessor process:audioContent]; + input = [[ContentReader alloc] initWithContentManager:self Content:songContent]; } else { [NSException raise:@"InvalidArgumentException" format:@"Files with extension %@ are not supported", extension]; } @@ -114,7 +129,7 @@ pool = [[NSAutoreleasePool alloc] init]; ContentTypeReader *reader = [readerManager getTypeReaderFor:[input.content class]]; - id result = [reader readFromInput:input into:nil]; + id result = [[reader readFromInput:input into:nil] retain]; // Save the loaded asset for quick retreival. if (assetName) { @@ -128,7 +143,7 @@ [pool release]; // We are returning a retained object since the loaded asset is always used for a longer time. - return [result retain]; + return result; } - (void) unload { diff --git a/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.h b/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.h index 9a07ae1..e7eca1c 100644 --- a/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.h +++ b/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.h @@ -20,6 +20,7 @@ VertexBufferReader *vertexBufferReader; ModelBoneReader *modelBoneReader; VertexDeclarationReader *vertexDeclarationReader; + SoundEffectReader *soundEffectReader; } - (ContentTypeReader*) getTypeReaderFor:(Class)targetType; diff --git a/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.m b/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.m index 731f466..d58a23a 100644 --- a/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.m +++ b/Classes/Retronator/Xni/Framework/Content/ContentTypeReaderManager.m @@ -27,6 +27,7 @@ vertexBufferReader = [[VertexBufferReader alloc] init]; modelBoneReader = [[ModelBoneReader alloc] init]; vertexDeclarationReader = [[VertexDeclarationReader alloc] init]; + soundEffectReader = [[SoundEffectReader alloc] init]; } return self; } @@ -51,6 +52,8 @@ return modelBoneReader; } else if (targetType == [VertexDeclarationContent class]) { return vertexDeclarationReader; + } else if (targetType == [SoundEffectContent class]) { + return soundEffectReader; } else { return nil; } diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.classes.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.classes.h index 4767a9e..b9776b2 100644 --- a/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.classes.h +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.classes.h @@ -8,6 +8,8 @@ @class ContentImporter; @class TextureImporter; @class XImporter; +@class WavImporter; +@class Mp3Importer; @protocol IContentProcessor; @class ContentProcessor; diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.h index f637d29..0e01cb0 100644 --- a/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.h +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/Retronator.Xni.Framework.Content.Pipeline.h @@ -11,6 +11,8 @@ #import "ContentImporter.h" #import "TextureImporter.h" #import "XImporter.h" +#import "WavImporter.h" +#import "Mp3Importer.h" #import "IContentProcessor.h" #import "ContentProcessor.h" \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Content/Pipeline/TextureImporter.h b/Classes/Retronator/Xni/Framework/Content/Pipeline/TextureImporter.h index f09cdf8..349c458 100644 --- a/Classes/Retronator/Xni/Framework/Content/Pipeline/TextureImporter.h +++ b/Classes/Retronator/Xni/Framework/Content/Pipeline/TextureImporter.h @@ -8,14 +8,10 @@ #import -#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.classes.h" - #import "ContentImporter.h" @interface TextureImporter : ContentImporter { } -- (TextureContent*) importFile:(NSString*)filename; - @end diff --git a/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.classes.h b/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.classes.h index 7842c08..0115d1d 100644 --- a/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.classes.h +++ b/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.classes.h @@ -3,4 +3,5 @@ @class Texture2DReader; @class ModelReader, ModelMeshReader, ModelMeshPartReader; @class BasicEffectReader, IndexBufferReader, VertexBufferReader; -@class ModelBoneReader, VertexDeclarationReader; \ No newline at end of file +@class ModelBoneReader, VertexDeclarationReader; +@class SoundEffectReader; \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.h b/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.h index 923bbde..38ae941 100644 --- a/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.h +++ b/Classes/Retronator/Xni/Framework/Content/Retronator.Xni.Framework.Content.h @@ -14,4 +14,6 @@ #import "VertexBufferReader.h" #import "ModelBoneReader.h" -#import "VertexDeclarationReader.h" \ No newline at end of file +#import "VertexDeclarationReader.h" + +#import "SoundEffectReader.h" \ No newline at end of file diff --git a/Classes/Retronator/Xni/Framework/Game.m b/Classes/Retronator/Xni/Framework/Game.m index 11bfe9c..993b97a 100644 --- a/Classes/Retronator/Xni/Framework/Game.m +++ b/Classes/Retronator/Xni/Framework/Game.m @@ -14,6 +14,7 @@ #import "TouchPanel+Internal.h" #import "GameWindow+Internal.h" #import "Guide+Internal.h" +#import "SoundEffect+Internal.h" @interface Game () @@ -133,7 +134,7 @@ static NSArray *drawOrderSort; - (void) tick { // Sleep if inactive. if (!isActive) { - //CFRunLoopRunInMode(kCFRunLoopDefaultMode, inactiveSleepTime, NO); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, inactiveSleepTime, NO); return; } @@ -142,7 +143,7 @@ static NSArray *drawOrderSort; NSTimeInterval elapsedRealTime = [currentFrameTime timeIntervalSinceDate:lastFrameTime]; // Sleep if we're ahead of the target elapsed time. - /*if (isFixedTimeStep) { + if (isFixedTimeStep) { if (elapsedRealTime < targetElapsedTime) { NSTimeInterval sleepTime = targetElapsedTime - elapsedRealTime; CFRunLoopRunInMode(kCFRunLoopDefaultMode, sleepTime, NO); @@ -155,7 +156,7 @@ static NSArray *drawOrderSort; } else { gameTime.isRunningSlowly = YES; } - }*/ + } // Store current time for next frame. [lastFrameTime release]; @@ -169,7 +170,7 @@ static NSArray *drawOrderSort; // Update input. [[TouchPanel getInstance] update]; - + // Update the game. [self updateWithGameTime:gameTime]; @@ -183,6 +184,9 @@ static NSArray *drawOrderSort; } [enabledChangedComponents removeAllObjects]; + // Update audio. + [SoundEffect update]; + // Draw to display. if ([self beginDraw]) { [self drawWithGameTime:gameTime]; diff --git a/Classes/Retronator/Xni/Framework/GameHost.m b/Classes/Retronator/Xni/Framework/GameHost.m index 704dde1..932e4cf 100644 --- a/Classes/Retronator/Xni/Framework/GameHost.m +++ b/Classes/Retronator/Xni/Framework/GameHost.m @@ -39,7 +39,6 @@ // Handle all the waiting event sources. do { runResult = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES); - NSLog(@"Handling default mode"); } while (runResult == kCFRunLoopRunHandledSource); [game tick];