Added very basic support for sound (via AL), also uses CDOpenALSupport
This commit is contained in:
parent
988683baee
commit
029347619b
4 changed files with 472 additions and 1 deletions
|
@ -11,12 +11,17 @@
|
||||||
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF5140A774D00A81A65 /* basic.cpp */; };
|
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF5140A774D00A81A65 /* basic.cpp */; };
|
||||||
425E9DF9140A7EB400A81A65 /* fbo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF8140A7EB400A81A65 /* fbo.mm */; };
|
425E9DF9140A7EB400A81A65 /* fbo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 425E9DF8140A7EB400A81A65 /* fbo.mm */; };
|
||||||
425E9DFB140A846700A81A65 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 425E9DFA140A846700A81A65 /* QuartzCore.framework */; };
|
425E9DFB140A846700A81A65 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 425E9DFA140A846700A81A65 /* QuartzCore.framework */; };
|
||||||
425E9E02140A96C400A81A65 /* J.h in Headers */ = {isa = PBXBuildFile; fileRef = 4268136D140A321800CBF943 /* J.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
425E9E02140A96C400A81A65 /* J.h in Headers */ = {isa = PBXBuildFile; fileRef = 4268136D140A321800CBF943 /* J.h */; settings = {ATTRIBUTES = (); }; };
|
||||||
42681369140A321800CBF943 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42681368140A321800CBF943 /* Foundation.framework */; };
|
42681369140A321800CBF943 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42681368140A321800CBF943 /* Foundation.framework */; };
|
||||||
4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; };
|
4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; };
|
||||||
4283A45F14115AC400036A5D /* interpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A45E14115AC300036A5D /* interpolator.h */; };
|
4283A45F14115AC400036A5D /* interpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A45E14115AC300036A5D /* interpolator.h */; };
|
||||||
4283A4641411707700036A5D /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A4631411707700036A5D /* array.h */; };
|
4283A4641411707700036A5D /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A4631411707700036A5D /* array.h */; };
|
||||||
429E3BAB159616FD0044306C /* texture_objc.mm in Sources */ = {isa = PBXBuildFile; fileRef = 429E3BAA159616FD0044306C /* texture_objc.mm */; };
|
429E3BAB159616FD0044306C /* texture_objc.mm in Sources */ = {isa = PBXBuildFile; fileRef = 429E3BAA159616FD0044306C /* texture_objc.mm */; };
|
||||||
|
42C7D6C016B31E7200DA372A /* sound.h in Headers */ = {isa = PBXBuildFile; fileRef = 42C7D6BF16B31E7200DA372A /* sound.h */; };
|
||||||
|
42C7D6C316B31E8B00DA372A /* CDOpenALSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 42C7D6C116B31E8B00DA372A /* CDOpenALSupport.h */; };
|
||||||
|
42C7D6C416B31E8B00DA372A /* CDOpenALSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 42C7D6C216B31E8B00DA372A /* CDOpenALSupport.m */; };
|
||||||
|
42C7D6CA16B31F1900DA372A /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42C7D6C616B31EE200DA372A /* OpenAL.framework */; };
|
||||||
|
42C7D6CB16B31F1E00DA372A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42C7D6C816B31EE800DA372A /* AudioToolbox.framework */; };
|
||||||
42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; };
|
42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; };
|
||||||
42ED6A6C140A380000402F76 /* shader.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A69140A380000402F76 /* shader.h */; };
|
42ED6A6C140A380000402F76 /* shader.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A69140A380000402F76 /* shader.h */; };
|
||||||
42ED6A6D140A380000402F76 /* to_string.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A6A140A380000402F76 /* to_string.h */; };
|
42ED6A6D140A380000402F76 /* to_string.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A6A140A380000402F76 /* to_string.h */; };
|
||||||
|
@ -37,6 +42,11 @@
|
||||||
429E3BA715960FCA0044306C /* texture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = texture.h; sourceTree = "<group>"; };
|
429E3BA715960FCA0044306C /* texture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = texture.h; sourceTree = "<group>"; };
|
||||||
429E3BA9159616C00044306C /* texture_objc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = texture_objc.h; sourceTree = "<group>"; };
|
429E3BA9159616C00044306C /* texture_objc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = texture_objc.h; sourceTree = "<group>"; };
|
||||||
429E3BAA159616FD0044306C /* texture_objc.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = texture_objc.mm; sourceTree = "<group>"; };
|
429E3BAA159616FD0044306C /* texture_objc.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = texture_objc.mm; sourceTree = "<group>"; };
|
||||||
|
42C7D6BF16B31E7200DA372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = "<group>"; };
|
||||||
|
42C7D6C116B31E8B00DA372A /* CDOpenALSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDOpenALSupport.h; sourceTree = "<group>"; };
|
||||||
|
42C7D6C216B31E8B00DA372A /* CDOpenALSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDOpenALSupport.m; sourceTree = "<group>"; };
|
||||||
|
42C7D6C616B31EE200DA372A /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; };
|
||||||
|
42C7D6C816B31EE800DA372A /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
||||||
42ED6A68140A380000402F76 /* fbo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbo.h; sourceTree = "<group>"; };
|
42ED6A68140A380000402F76 /* fbo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbo.h; sourceTree = "<group>"; };
|
||||||
42ED6A69140A380000402F76 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = "<group>"; };
|
42ED6A69140A380000402F76 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = "<group>"; };
|
||||||
42ED6A6A140A380000402F76 /* to_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = to_string.h; sourceTree = "<group>"; };
|
42ED6A6A140A380000402F76 /* to_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = to_string.h; sourceTree = "<group>"; };
|
||||||
|
@ -47,6 +57,8 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
42C7D6CB16B31F1E00DA372A /* AudioToolbox.framework in Frameworks */,
|
||||||
|
42C7D6CA16B31F1900DA372A /* OpenAL.framework in Frameworks */,
|
||||||
425E9DFB140A846700A81A65 /* QuartzCore.framework in Frameworks */,
|
425E9DFB140A846700A81A65 /* QuartzCore.framework in Frameworks */,
|
||||||
42681369140A321800CBF943 /* Foundation.framework in Frameworks */,
|
42681369140A321800CBF943 /* Foundation.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
|
@ -87,6 +99,8 @@
|
||||||
42681367140A321800CBF943 /* Frameworks */ = {
|
42681367140A321800CBF943 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
42C7D6C816B31EE800DA372A /* AudioToolbox.framework */,
|
||||||
|
42C7D6C616B31EE200DA372A /* OpenAL.framework */,
|
||||||
425E9DFA140A846700A81A65 /* QuartzCore.framework */,
|
425E9DFA140A846700A81A65 /* QuartzCore.framework */,
|
||||||
42681368140A321800CBF943 /* Foundation.framework */,
|
42681368140A321800CBF943 /* Foundation.framework */,
|
||||||
);
|
);
|
||||||
|
@ -96,6 +110,7 @@
|
||||||
4268136A140A321800CBF943 /* J */ = {
|
4268136A140A321800CBF943 /* J */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
42C7D6BE16B31E5400DA372A /* AL */,
|
||||||
4283A46114115AD400036A5D /* GL */,
|
4283A46114115AD400036A5D /* GL */,
|
||||||
4283A46214116ECB00036A5D /* utils */,
|
4283A46214116ECB00036A5D /* utils */,
|
||||||
4268136D140A321800CBF943 /* J.h */,
|
4268136D140A321800CBF943 /* J.h */,
|
||||||
|
@ -136,6 +151,16 @@
|
||||||
name = utils;
|
name = utils;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
42C7D6BE16B31E5400DA372A /* AL */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
42C7D6C116B31E8B00DA372A /* CDOpenALSupport.h */,
|
||||||
|
42C7D6C216B31E8B00DA372A /* CDOpenALSupport.m */,
|
||||||
|
42C7D6BF16B31E7200DA372A /* sound.h */,
|
||||||
|
);
|
||||||
|
name = AL;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
|
@ -150,6 +175,8 @@
|
||||||
425E9DF2140A74DA00A81A65 /* basic.h in Headers */,
|
425E9DF2140A74DA00A81A65 /* basic.h in Headers */,
|
||||||
4283A45F14115AC400036A5D /* interpolator.h in Headers */,
|
4283A45F14115AC400036A5D /* interpolator.h in Headers */,
|
||||||
4283A4641411707700036A5D /* array.h in Headers */,
|
4283A4641411707700036A5D /* array.h in Headers */,
|
||||||
|
42C7D6C016B31E7200DA372A /* sound.h in Headers */,
|
||||||
|
42C7D6C316B31E8B00DA372A /* CDOpenALSupport.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -207,6 +234,8 @@
|
||||||
4268136F140A321800CBF943 /* J.mm in Sources */,
|
4268136F140A321800CBF943 /* J.mm in Sources */,
|
||||||
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */,
|
425E9DF6140A774D00A81A65 /* basic.cpp in Sources */,
|
||||||
425E9DF9140A7EB400A81A65 /* fbo.mm in Sources */,
|
425E9DF9140A7EB400A81A65 /* fbo.mm in Sources */,
|
||||||
|
429E3BAB159616FD0044306C /* texture_objc.mm in Sources */,
|
||||||
|
42C7D6C416B31E8B00DA372A /* CDOpenALSupport.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
77
J/CDOpenALSupport.h
Normal file
77
J/CDOpenALSupport.h
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Disclaimer: IMPORTANT: This Apple software is supplied to you by
|
||||||
|
Apple Inc. ("Apple") in consideration of your agreement to the
|
||||||
|
following terms, and your use, installation, modification or
|
||||||
|
redistribution of this Apple software constitutes acceptance of these
|
||||||
|
terms. If you do not agree with these terms, please do not use,
|
||||||
|
install, modify or redistribute this Apple software.
|
||||||
|
|
||||||
|
In consideration of your agreement to abide by the following terms, and
|
||||||
|
subject to these terms, Apple grants you a personal, non-exclusive
|
||||||
|
license, under Apple's copyrights in this original Apple software (the
|
||||||
|
"Apple Software"), to use, reproduce, modify and redistribute the Apple
|
||||||
|
Software, with or without modifications, in source and/or binary forms;
|
||||||
|
provided that if you redistribute the Apple Software in its entirety and
|
||||||
|
without modifications, you must retain this notice and the following
|
||||||
|
text and disclaimers in all such redistributions of the Apple Software.
|
||||||
|
Neither the name, trademarks, service marks or logos of Apple Inc.
|
||||||
|
may be used to endorse or promote products derived from the Apple
|
||||||
|
Software without specific prior written permission from Apple. Except
|
||||||
|
as expressly stated in this notice, no other rights or licenses, express
|
||||||
|
or implied, are granted by Apple herein, including but not limited to
|
||||||
|
any patent rights that may be infringed by your derivative works or by
|
||||||
|
other works in which the Apple Software may be incorporated.
|
||||||
|
|
||||||
|
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
|
||||||
|
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
|
||||||
|
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
|
||||||
|
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
|
||||||
|
|
||||||
|
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
|
||||||
|
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
|
||||||
|
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
|
||||||
|
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
|
||||||
|
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Copyright (C) 2009 Apple Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This file contains code from version 1.1 and 1.4 of MyOpenALSupport.h taken from Apple's oalTouch version.
|
||||||
|
The 1.4 version code is used for loading IMA4 files, however, this code causes very noticeable clicking
|
||||||
|
when used to load wave files that are looped so the 1.1 version code is used specifically for loading
|
||||||
|
wav files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CD_OPENAL_H
|
||||||
|
#define __CD_OPENAL_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <OpenAL/al.h>
|
||||||
|
#include <OpenAL/alc.h>
|
||||||
|
#include <CoreFoundation/CFURL.h>
|
||||||
|
|
||||||
|
|
||||||
|
//Taken from oalTouch MyOpenALSupport 1.1
|
||||||
|
void* CDloadWaveAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei* outSampleRate);
|
||||||
|
void* CDloadCafAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei* outSampleRate);
|
||||||
|
void* CDGetOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei* outSampleRate);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
250
J/CDOpenALSupport.m
Normal file
250
J/CDOpenALSupport.m
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Disclaimer: IMPORTANT: This Apple software is supplied to you by
|
||||||
|
Apple Inc. ("Apple") in consideration of your agreement to the
|
||||||
|
following terms, and your use, installation, modification or
|
||||||
|
redistribution of this Apple software constitutes acceptance of these
|
||||||
|
terms. If you do not agree with these terms, please do not use,
|
||||||
|
install, modify or redistribute this Apple software.
|
||||||
|
|
||||||
|
In consideration of your agreement to abide by the following terms, and
|
||||||
|
subject to these terms, Apple grants you a personal, non-exclusive
|
||||||
|
license, under Apple's copyrights in this original Apple software (the
|
||||||
|
"Apple Software"), to use, reproduce, modify and redistribute the Apple
|
||||||
|
Software, with or without modifications, in source and/or binary forms;
|
||||||
|
provided that if you redistribute the Apple Software in its entirety and
|
||||||
|
without modifications, you must retain this notice and the following
|
||||||
|
text and disclaimers in all such redistributions of the Apple Software.
|
||||||
|
Neither the name, trademarks, service marks or logos of Apple Inc.
|
||||||
|
may be used to endorse or promote products derived from the Apple
|
||||||
|
Software without specific prior written permission from Apple. Except
|
||||||
|
as expressly stated in this notice, no other rights or licenses, express
|
||||||
|
or implied, are granted by Apple herein, including but not limited to
|
||||||
|
any patent rights that may be infringed by your derivative works or by
|
||||||
|
other works in which the Apple Software may be incorporated.
|
||||||
|
|
||||||
|
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
|
||||||
|
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
|
||||||
|
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
|
||||||
|
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
|
||||||
|
|
||||||
|
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
|
||||||
|
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
|
||||||
|
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
|
||||||
|
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
|
||||||
|
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Copyright (C) 2009 Apple Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
$Id: CDOpenALSupport.h 16 2010-03-11 06:22:10Z steveoldmeadow $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <UIKit/UIKit.h>
|
||||||
|
#include "CDOpenALSupport.h"
|
||||||
|
#include <AudioToolbox/AudioToolbox.h>
|
||||||
|
#include <AudioToolbox/ExtendedAudioFile.h>
|
||||||
|
|
||||||
|
//Taken from oalTouch MyOpenALSupport 1.1
|
||||||
|
void* CDloadWaveAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei* outSampleRate)
|
||||||
|
{
|
||||||
|
OSStatus err = noErr;
|
||||||
|
UInt64 fileDataSize = 0;
|
||||||
|
AudioStreamBasicDescription theFileFormat;
|
||||||
|
UInt32 thePropertySize = sizeof(theFileFormat);
|
||||||
|
AudioFileID afid = 0;
|
||||||
|
void* theData = NULL;
|
||||||
|
|
||||||
|
// Open a file with ExtAudioFileOpen()
|
||||||
|
err = AudioFileOpenURL(inFileURL, kAudioFileReadPermission, 0, &afid);
|
||||||
|
if(err) { NSLog(@"MyGetOpenALAudioData: AudioFileOpenURL FAILED, Error = %ld\n", err); goto Exit; }
|
||||||
|
|
||||||
|
// Get the audio data format
|
||||||
|
err = AudioFileGetProperty(afid, kAudioFilePropertyDataFormat, &thePropertySize, &theFileFormat);
|
||||||
|
if(err) { NSLog(@"MyGetOpenALAudioData: AudioFileGetProperty(kAudioFileProperty_DataFormat) FAILED, Error = %ld\n", err); goto Exit; }
|
||||||
|
|
||||||
|
if (theFileFormat.mChannelsPerFrame > 2) {
|
||||||
|
NSLog(@"MyGetOpenALAudioData - Unsupported Format, channel count is greater than stereo\n"); goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((theFileFormat.mFormatID != kAudioFormatLinearPCM) || (!TestAudioFormatNativeEndian(theFileFormat))) {
|
||||||
|
NSLog(@"MyGetOpenALAudioData - Unsupported Format, must be little-endian PCM\n"); goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((theFileFormat.mBitsPerChannel != 8) && (theFileFormat.mBitsPerChannel != 16)) {
|
||||||
|
NSLog(@"MyGetOpenALAudioData - Unsupported Format, must be 8 or 16 bit PCM\n"); goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
thePropertySize = sizeof(fileDataSize);
|
||||||
|
err = AudioFileGetProperty(afid, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize);
|
||||||
|
if(err) { NSLog(@"MyGetOpenALAudioData: AudioFileGetProperty(kAudioFilePropertyAudioDataByteCount) FAILED, Error = %ld\n", err); goto Exit; }
|
||||||
|
|
||||||
|
// Read all the data into memory
|
||||||
|
UInt32 dataSize = (UInt32)fileDataSize;
|
||||||
|
theData = malloc(dataSize);
|
||||||
|
if (theData)
|
||||||
|
{
|
||||||
|
memset(theData, 0, dataSize);
|
||||||
|
|
||||||
|
AudioFileReadBytes(afid, false, 0, &dataSize, theData);
|
||||||
|
if(err == noErr)
|
||||||
|
{
|
||||||
|
// success
|
||||||
|
*outDataSize = (ALsizei)dataSize;
|
||||||
|
//This fix was added by me, however, 8 bit sounds have a clipping sound at the end so aren't really usable (SO)
|
||||||
|
if (theFileFormat.mBitsPerChannel == 16) {
|
||||||
|
*outDataFormat = (theFileFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16;
|
||||||
|
} else {
|
||||||
|
*outDataFormat = (theFileFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO8 : AL_FORMAT_MONO8;
|
||||||
|
}
|
||||||
|
*outSampleRate = (ALsizei)theFileFormat.mSampleRate;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// failure
|
||||||
|
free (theData);
|
||||||
|
theData = NULL; // make sure to return NULL
|
||||||
|
NSLog(@"MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n", err); goto Exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Exit:
|
||||||
|
// Dispose the ExtAudioFileRef, it is no longer needed
|
||||||
|
if (afid) AudioFileClose(afid);
|
||||||
|
return theData;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Taken from oalTouch MyOpenALSupport 1.4
|
||||||
|
void* CDloadCafAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei* outSampleRate)
|
||||||
|
{
|
||||||
|
OSStatus status = noErr;
|
||||||
|
BOOL abort = NO;
|
||||||
|
SInt64 theFileLengthInFrames = 0;
|
||||||
|
AudioStreamBasicDescription theFileFormat;
|
||||||
|
UInt32 thePropertySize = sizeof(theFileFormat);
|
||||||
|
ExtAudioFileRef extRef = NULL;
|
||||||
|
void* theData = NULL;
|
||||||
|
AudioStreamBasicDescription theOutputFormat;
|
||||||
|
UInt32 dataSize = 0;
|
||||||
|
|
||||||
|
// Open a file with ExtAudioFileOpen()
|
||||||
|
status = ExtAudioFileOpenURL(inFileURL, &extRef);
|
||||||
|
if (status != noErr)
|
||||||
|
{
|
||||||
|
NSLog(@"MyGetOpenALAudioData: ExtAudioFileOpenURL FAILED, Error = %ld\n", status);
|
||||||
|
abort = YES;
|
||||||
|
}
|
||||||
|
if (abort)
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
// Get the audio data format
|
||||||
|
status = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &theFileFormat);
|
||||||
|
if (status != noErr)
|
||||||
|
{
|
||||||
|
NSLog(@"MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error = %ld\n", status);
|
||||||
|
abort = YES;
|
||||||
|
}
|
||||||
|
if (abort)
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
if (theFileFormat.mChannelsPerFrame > 2)
|
||||||
|
{
|
||||||
|
NSLog(@"MyGetOpenALAudioData - Unsupported Format, channel count is greater than stereo\n");
|
||||||
|
abort = YES;
|
||||||
|
}
|
||||||
|
if (abort)
|
||||||
|
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
|
||||||
|
status = ExtAudioFileSetProperty(extRef, kExtAudioFileProperty_ClientDataFormat, sizeof(theOutputFormat), &theOutputFormat);
|
||||||
|
if (status != noErr)
|
||||||
|
{
|
||||||
|
NSLog(@"MyGetOpenALAudioData: ExtAudioFileSetProperty(kExtAudioFileProperty_ClientDataFormat) FAILED, Error = %ld\n", status);
|
||||||
|
abort = YES;
|
||||||
|
}
|
||||||
|
if (abort)
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
// Get the total frame count
|
||||||
|
thePropertySize = sizeof(theFileLengthInFrames);
|
||||||
|
status = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileLengthFrames, &thePropertySize, &theFileLengthInFrames);
|
||||||
|
if (status != noErr)
|
||||||
|
{
|
||||||
|
NSLog(@"MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileLengthFrames) FAILED, Error = %ld\n", status);
|
||||||
|
abort = YES;
|
||||||
|
}
|
||||||
|
if (abort)
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
// Read all the data into memory
|
||||||
|
dataSize = (UInt32) theFileLengthInFrames * theOutputFormat.mBytesPerFrame;
|
||||||
|
theData = malloc(dataSize);
|
||||||
|
if (theData)
|
||||||
|
{
|
||||||
|
memset(theData, 0, dataSize);
|
||||||
|
|
||||||
|
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
|
||||||
|
status = ExtAudioFileRead(extRef, (UInt32*)&theFileLengthInFrames, &theDataBuffer);
|
||||||
|
if(status == 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
|
||||||
|
NSLog(@"MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n", status);
|
||||||
|
abort = YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (abort)
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
Exit:
|
||||||
|
// Dispose the ExtAudioFileRef, it is no longer needed
|
||||||
|
if (extRef) ExtAudioFileDispose(extRef);
|
||||||
|
return theData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* CDGetOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei* outSampleRate) {
|
||||||
|
|
||||||
|
CFStringRef extension = CFURLCopyPathExtension(inFileURL);
|
||||||
|
CFComparisonResult isWavFile = 0;
|
||||||
|
if (extension != NULL) {
|
||||||
|
isWavFile = CFStringCompare (extension,(CFStringRef)@"wav", kCFCompareCaseInsensitive);
|
||||||
|
CFRelease(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isWavFile == kCFCompareEqualTo) {
|
||||||
|
return CDloadWaveAudioData(inFileURL, outDataSize, outDataFormat, outSampleRate);
|
||||||
|
} else {
|
||||||
|
return CDloadCafAudioData(inFileURL, outDataSize, outDataFormat, outSampleRate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
115
J/sound.h
Normal file
115
J/sound.h
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
//
|
||||||
|
// Sound.h
|
||||||
|
// SoundDrop2
|
||||||
|
//
|
||||||
|
// Created by Joshua Moerman on 1/9/13.
|
||||||
|
// Copyright (c) 2013 Vadovas. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SoundDrop2_Sound_h
|
||||||
|
#define SoundDrop2_Sound_h
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <OpenAL/al.h>
|
||||||
|
#include <OpenAL/alc.h>
|
||||||
|
|
||||||
|
#include "CDOpenALSupport.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace J {
|
||||||
|
|
||||||
|
struct AL {
|
||||||
|
ALCdevice * device{nullptr};
|
||||||
|
ALCcontext * context{nullptr};
|
||||||
|
|
||||||
|
AL(){
|
||||||
|
// Initializing sound:
|
||||||
|
// NULL for the default device
|
||||||
|
device = alcOpenDevice(NULL);
|
||||||
|
if (device) {
|
||||||
|
// NULL for no attributes
|
||||||
|
context = alcCreateContext(device, NULL);
|
||||||
|
alcMakeContextCurrent(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~AL(){
|
||||||
|
alcMakeContextCurrent(NULL);
|
||||||
|
alcDestroyContext(context);
|
||||||
|
alcCloseDevice(device);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Buffer {
|
||||||
|
ALuint buffer;
|
||||||
|
|
||||||
|
Buffer(Buffer const &) = delete;
|
||||||
|
Buffer & operator=(Buffer const &) = delete;
|
||||||
|
|
||||||
|
Buffer(Buffer && b){
|
||||||
|
std::swap(buffer, b.buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer & operator=(Buffer && b){
|
||||||
|
std::swap(buffer, b.buffer);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer(){
|
||||||
|
alGenBuffers(1, &buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
~Buffer(){
|
||||||
|
alDeleteBuffers(1, &buffer);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline Buffer load_wav(std::string filename){
|
||||||
|
Buffer b;
|
||||||
|
|
||||||
|
void *data;
|
||||||
|
ALenum format;
|
||||||
|
ALsizei sizeInBytes;
|
||||||
|
ALsizei frequencyInHertz;
|
||||||
|
|
||||||
|
data = CDGetOpenALAudioData((CFURLRef)[NSURL fileURLWithPath: [NSString stringWithUTF8String: filename.c_str()]], &sizeInBytes, &format, &frequencyInHertz);
|
||||||
|
alBufferData(b.buffer, format, data, sizeInBytes, frequencyInHertz);
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Source {
|
||||||
|
ALuint source;
|
||||||
|
|
||||||
|
Source(Source const &) = delete;
|
||||||
|
Source & operator=(Source const &) = delete;
|
||||||
|
|
||||||
|
Source(Buffer const & buffer){
|
||||||
|
int r = rand() % 10;
|
||||||
|
float pitch = 0.5 + r*0.5;
|
||||||
|
|
||||||
|
alGenSources(1, &source);
|
||||||
|
alSourcei(source, AL_BUFFER, buffer.buffer);
|
||||||
|
alSourcef(source, AL_PITCH, pitch); //?
|
||||||
|
}
|
||||||
|
|
||||||
|
void play(){
|
||||||
|
// will restart if already playing
|
||||||
|
alSourcePlay(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
~Source(){
|
||||||
|
// TODO: find out if this is needed
|
||||||
|
// NOTE: Buffers which are attached to a source can not be deleted
|
||||||
|
alSourcei(source, AL_BUFFER, 0);
|
||||||
|
|
||||||
|
// this will stop the playing
|
||||||
|
alDeleteSources(1, &source);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace J
|
||||||
|
|
||||||
|
#endif
|
Reference in a new issue