Implement sound out to file

This commit is contained in:
Matthias Neeracher 2006-11-27 07:01:38 +00:00
parent df858d805c
commit 5359a95757
6 changed files with 803 additions and 75 deletions

View File

@ -0,0 +1,81 @@
/* Copyright: © Copyright 2005 Apple Computer, Inc. All rights reserved.
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, 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 Computer, 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.
*/
/*=============================================================================
CAConditionalMacros.h
=============================================================================*/
#if !defined(__CAConditionalMacros_h__)
#define __CAConditionalMacros_h__
//=============================================================================
// This file exists to make figuring out how to include system headers
// easier in a cross platform world. We throw in an include of the standard
// ConditionalMacros too.
//=============================================================================
// ########## THIS FILE SHOULD GO AWAY SOON, replaced by __COREAUDIO_USE_FLAT_INCLUDES__
// but for now, use this as a way to define __COREAUDIO_USE_FLAT_INCLUDES__ programmatically
// TargetConditionals.h defines the bare minimum we need
#include "TargetConditionals.h"
// Determine whether or not to use framework style includes for system headers
#if !defined(CoreAudio_Use_Framework_Includes) && !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
#if TARGET_RT_MAC_MACHO
#define CoreAudio_Use_Framework_Includes 1
#else
#define CoreAudio_Use_Framework_Includes 0
#endif
#endif
// Include the regular ConditionalMacros.h too, since it has useful stuff that
// TargetConditionals.h lacks for some reason.
#if CoreAudio_Use_Framework_Includes
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/ConditionalMacros.h>
#else
#include "ConditionalMacros.h"
#endif
#ifndef TARGET_CPU_PPC_ANY
#define TARGET_CPU_PPC_ANY (TARGET_CPU_PPC || TARGET_CPU_PPC64)
#endif
#ifndef TARGET_CPU_X86_ANY
#define TARGET_CPU_X86_ANY (TARGET_CPU_X86 || TARGET_CPU_X86_64)
#endif
#endif

View File

@ -0,0 +1,84 @@
/* Copyright: © Copyright 2005 Apple Computer, Inc. All rights reserved.
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, 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 Computer, 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.
*/
/*=============================================================================
CADebugMacros.cp
=============================================================================*/
#include "CADebugMacros.h"
#include <stdio.h>
#include <stdarg.h>
#if TARGET_API_MAC_OSX
#include <syslog.h>
#endif
#if DEBUG
#include <stdio.h>
void DebugPrint(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
#endif // DEBUG
#if TARGET_API_MAC_OSX
void LogError(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
#if DEBUG
vprintf(fmt, args);
#endif
vsyslog(LOG_ERR, fmt, args);
va_end(args);
}
void LogWarning(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
#if DEBUG
vprintf(fmt, args);
#endif
vsyslog(LOG_WARNING, fmt, args);
va_end(args);
}
#endif

View File

@ -0,0 +1,492 @@
/* Copyright: © Copyright 2005 Apple Computer, Inc. All rights reserved.
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, 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 Computer, 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.
*/
/*=============================================================================
CADebugMacros.h
Revision 1.22 2006/01/17 22:13:07 dwyatt
__LP64__ warnings
Revision 1.21 2005/03/15 22:50:28 jcm10
use DebugPrintfLineEnding so that syslog doesn't get filled with empty lines
Revision 1.20 2004/10/27 01:28:08 jcm10
add more FailIf macros
Revision 1.19 2004/09/09 09:14:26 jcm10
add a ThrowIf for Windows errors
Revision 1.18 2004/08/25 02:26:26 jcm10
always flush when using the side file
Revision 1.17 2004/08/02 18:45:35 dwyatt
add LogWarning
Revision 1.16 2004/04/13 21:00:55 jcm10
get rid of ThrowError
Revision 1.15 2004/04/12 22:58:29 jcm10
fix the macros that used 4CC's to not generate warnings in release builds
Revision 1.14 2004/04/01 20:00:36 jcm10
add Throw and clean up the ThrowIf macros
Revision 1.13 2004/02/27 01:45:19 jcm10
add ThrowError()
Revision 1.12 2004/01/29 22:50:09 jcm10
have AssertNoError print the error number as a 4 char code
Revision 1.11 2003/08/29 04:13:55 jcm10
show the time in milliseconds
Revision 1.10 2003/07/04 23:56:26 jcm10
add a few more DebugMessages
Revision 1.9 2003/06/06 01:51:32 jcm10
clean up some whitespace
Revision 1.8 2002/12/14 23:59:58 jcm10
CADebugger is now C compatible so it can be included in pre-compiled headers
Revision 1.7 2002/10/02 21:01:40 jcm10
add ThrowIfNULL
Revision 1.6 2002/09/11 19:17:55 jcm10
in ThrowIfError, print the error number as a four char code too
Revision 1.5 2002/07/20 01:46:45 jcm10
turn off thread stamping
Revision 1.4 2002/07/17 21:53:08 jcm10
make the thread stamping and time stamping work right
Revision 1.3 2002/07/03 23:49:55 jcm10
add AssertNoKernelError
Revision 1.2 2002/05/02 22:31:57 jcm10
display kernel errors in hex
Revision 1.1 2002/03/01 01:52:40 jcm10
moved here from ../Utility
Revision 1.1 2002/02/28 23:18:54 jcm10
added the CA prefix to the files for more consistency
Revision 0.0 Thu Feb 28 2002 14:46:56 US/Pacific moorf
Created
$NoKeywords: $
=============================================================================*/
#if !defined(__CADebugMacros_h__)
#define __CADebugMacros_h__
//=============================================================================
// CADebugMacros
//=============================================================================
//#define CoreAudio_StopOnFailure 1
//#define CoreAudio_TimeStampMessages 1
//#define CoreAudio_ThreadStampMessages 1
//#define CoreAudio_FlushDebugMessages 1
#if __BIG_ENDIAN__
#define CA4CCToCString(the4CC) { ((char*)&the4CC)[0], ((char*)&the4CC)[1], ((char*)&the4CC)[2], ((char*)&the4CC)[3], 0 }
#else
#define CA4CCToCString(the4CC) { ((char*)&the4CC)[3], ((char*)&the4CC)[2], ((char*)&the4CC)[1], ((char*)&the4CC)[0], 0 }
#endif
#pragma mark Basic Definitions
#if DEBUG || CoreAudio_Debug
// can be used to break into debugger immediately, also see CADebugger
#define BusError() (*(long *)0 = 0)
// basic debugging print routines
#if TARGET_OS_MAC && !TARGET_API_MAC_CARBON
extern pascal void DebugStr(const unsigned char* debuggerMsg);
#define DebugMessage(msg) DebugStr("\p"msg)
#define DebugMessageN1(msg, N1)
#define DebugMessageN2(msg, N1, N2)
#define DebugMessageN3(msg, N1, N2, N3)
#else
#include "CADebugPrintf.h"
#if (CoreAudio_FlushDebugMessages && !CoreAudio_UseSysLog) || defined(CoreAudio_UseSideFile)
#define FlushRtn ;fflush(DebugPrintfFile)
#else
#define FlushRtn
#endif
#if CoreAudio_ThreadStampMessages
#include <pthread.h>
#include "CAHostTimeBase.h"
#define DebugMessage(msg) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: %s"DebugPrintfLineEnding, pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), msg) FlushRtn
#define DebugMessageN1(msg, N1) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1) FlushRtn
#define DebugMessageN2(msg, N1, N2) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2) FlushRtn
#define DebugMessageN3(msg, N1, N2, N3) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3) FlushRtn
#define DebugMessageN4(msg, N1, N2, N3, N4) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4) FlushRtn
#define DebugMessageN5(msg, N1, N2, N3, N4, N5) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5) FlushRtn
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6) FlushRtn
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6, N7) FlushRtn
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6, N7, N8) FlushRtn
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9) DebugPrintfRtn(DebugPrintfFile, "%p %.4f: "msg"\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6, N7, N8, N9) FlushRtn
#elif CoreAudio_TimeStampMessages
#include "CAHostTimeBase.h"
#define DebugMessage(msg) DebugPrintfRtn(DebugPrintfFile, "%.4f: %s"DebugPrintfLineEnding, pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), msg) FlushRtn
#define DebugMessageN1(msg, N1) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1) FlushRtn
#define DebugMessageN2(msg, N1, N2) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2) FlushRtn
#define DebugMessageN3(msg, N1, N2, N3) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3) FlushRtn
#define DebugMessageN4(msg, N1, N2, N3, N4) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4) FlushRtn
#define DebugMessageN5(msg, N1, N2, N3, N4, N5) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5) FlushRtn
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6) FlushRtn
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6, N7) FlushRtn
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6, N7, N8) FlushRtn
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9) DebugPrintfRtn(DebugPrintfFile, "%.4f: "msg DebugPrintfLineEnding, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), N1, N2, N3, N4, N5, N6, N7, N8, N9) FlushRtn
#else
#define DebugMessage(msg) DebugPrintfRtn(DebugPrintfFile, "%s"DebugPrintfLineEnding, msg) FlushRtn
#define DebugMessageN1(msg, N1) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1) FlushRtn
#define DebugMessageN2(msg, N1, N2) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2) FlushRtn
#define DebugMessageN3(msg, N1, N2, N3) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3) FlushRtn
#define DebugMessageN4(msg, N1, N2, N3, N4) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3, N4) FlushRtn
#define DebugMessageN5(msg, N1, N2, N3, N4, N5) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3, N4, N5) FlushRtn
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3, N4, N5, N6) FlushRtn
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3, N4, N5, N6, N7) FlushRtn
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3, N4, N5, N6, N7, N8) FlushRtn
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9) DebugPrintfRtn(DebugPrintfFile, msg DebugPrintfLineEnding, N1, N2, N3, N4, N5, N6, N7, N8, N9) FlushRtn
#endif
#endif
void DebugPrint(const char *fmt, ...); // can be used like printf
#define DEBUGPRINT(msg) DebugPrint msg // have to double-parenthesize arglist (see Debugging.h)
#if VERBOSE
#define vprint(msg) DEBUGPRINT(msg)
#else
#define vprint(msg)
#endif
#if CoreAudio_StopOnFailure
#include "CADebugger.h"
#define STOP CADebuggerStop()
#else
#define STOP
#endif
#else
#define DebugMessage(msg)
#define DebugMessageN1(msg, N1)
#define DebugMessageN2(msg, N1, N2)
#define DebugMessageN3(msg, N1, N2, N3)
#define DebugMessageN4(msg, N1, N2, N3, N4)
#define DebugMessageN5(msg, N1, N2, N3, N4, N5)
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6)
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7)
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8)
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9)
#define DEBUGPRINT(msg)
#define vprint(msg)
#define STOP
#endif
void LogError(const char *fmt, ...); // writes to syslog (and stderr if debugging)
void LogWarning(const char *fmt, ...); // writes to syslog (and stderr if debugging)
#if DEBUG || CoreAudio_Debug
#pragma mark Debug Macros
#define Assert(inCondition, inMessage) \
if(!(inCondition)) \
{ \
DebugMessage(inMessage); \
STOP; \
}
#define AssertNoError(inError, inMessage) \
{ \
SInt32 __Err = (inError); \
if(__Err != 0) \
{ \
char __4CC[5] = CA4CCToCString(__Err); \
DebugMessageN2(inMessage ", Error: %d (%s)", (int)__Err, __4CC); \
STOP; \
} \
}
#define AssertNoKernelError(inError, inMessage) \
{ \
unsigned int __Err = (unsigned int)(inError); \
if(__Err != 0) \
{ \
DebugMessageN1(inMessage ", Error: 0x%X", __Err); \
STOP; \
} \
}
#define FailIf(inCondition, inHandler, inMessage) \
if(inCondition) \
{ \
DebugMessage(inMessage); \
STOP; \
goto inHandler; \
}
#define FailWithAction(inCondition, inAction, inHandler, inMessage) \
if(inCondition) \
{ \
DebugMessage(inMessage); \
STOP; \
{ inAction; } \
goto inHandler; \
}
#define FailIfNULL(inPointer, inAction, inHandler, inMessage) \
if((inPointer) == NULL) \
{ \
DebugMessage(inMessage); \
STOP; \
{ inAction; } \
goto inHandler; \
}
#define FailIfKernelError(inKernelError, inException, inMessage) \
{ \
kern_return_t __Err = (inKernelError); \
if(__Err != 0) \
{ \
DebugMessageN1(inMessage ", Error: 0x%X", __Err); \
STOP; \
{ inAction; } \
goto inHandler; \
} \
}
#define FailIfError(inError, inException, inMessage) \
{ \
SInt32 __Err = (inError); \
if(__Err != 0) \
{ \
char __4CC[5] = CA4CCToCString(__Err); \
DebugMessageN2(inMessage ", Error: %ld (%s)", __Err, __4CC); \
STOP; \
{ inAction; } \
goto inHandler; \
} \
}
#if defined(__cplusplus)
#define Throw(inException) STOP; throw (inException)
#define ThrowIf(inCondition, inException, inMessage) \
if(inCondition) \
{ \
DebugMessage(inMessage); \
Throw(inException); \
}
#define ThrowIfNULL(inPointer, inException, inMessage) \
if((inPointer) == NULL) \
{ \
DebugMessage(inMessage); \
Throw(inException); \
}
#define ThrowIfKernelError(inKernelError, inException, inMessage) \
{ \
kern_return_t __Err = (inKernelError); \
if(__Err != 0) \
{ \
DebugMessageN1(inMessage ", Error: 0x%X", __Err); \
Throw(inException); \
} \
}
#define ThrowIfError(inError, inException, inMessage) \
{ \
SInt32 __Err = (inError); \
if(__Err != 0) \
{ \
char __4CC[5] = CA4CCToCString(__Err); \
DebugMessageN2(inMessage ", Error: %d (%s)", (int)__Err, __4CC); \
Throw(inException); \
} \
}
#if TARGET_OS_WIN32
#define ThrowIfWinError(inError, inException, inMessage) \
{ \
HRESULT __Err = (inError); \
if(FAILED(__Err)) \
{ \
DebugMessageN1(inMessage ", Error: 0x%X", __Err); \
Throw(inException); \
} \
}
#endif
#define SubclassResponsibility(inMethodName, inException) \
{ \
DebugMessage(inMethodName": Subclasses must implement this method"); \
Throw(inException); \
}
#endif // defined(__cplusplus)
#else
#pragma mark Release Macros
#define Assert(inCondition, inMessage) \
if(!(inCondition)) \
{ \
STOP; \
}
#define AssertNoError(inError, inMessage) \
{ \
SInt32 __Err = (inError); \
if(__Err != 0) \
{ \
STOP; \
} \
}
#define AssertNoKernelError(inError, inMessage) \
{ \
unsigned int __Err = (unsigned int)(inError); \
if(__Err != 0) \
{ \
STOP; \
} \
}
#define FailIf(inCondition, inHandler, inMessage) \
if(inCondition) \
{ \
STOP; \
goto inHandler; \
}
#define FailWithAction(inCondition, inAction, inHandler, inMessage) \
if(inCondition) \
{ \
STOP; \
{ inAction; } \
goto inHandler; \
}
#define FailIfNULL(inPointer, inAction, inHandler, inMessage) \
if((inPointer) == NULL) \
{ \
STOP; \
{ inAction; } \
goto inHandler; \
}
#define FailIfKernelError(inKernelError, inException, inMessage) \
if((inKernelError) != 0) \
{ \
STOP; \
{ inAction; } \
goto inHandler; \
}
#define FailIfError(inError, inException, inMessage) \
if((inError) != 0) \
{ \
STOP; \
{ inAction; } \
goto inHandler; \
}
#if defined(__cplusplus)
#define Throw(inException) STOP; throw (inException)
#define ThrowIf(inCondition, inException, inMessage) \
if(inCondition) \
{ \
Throw(inException); \
}
#define ThrowIfNULL(inPointer, inException, inMessage) \
if((inPointer) == NULL) \
{ \
Throw(inException); \
}
#define ThrowIfKernelError(inKernelError, inException, inMessage) \
{ \
kern_return_t __Err = (inKernelError); \
if(__Err != 0) \
{ \
Throw(inException); \
} \
}
#define ThrowIfError(inError, inException, inMessage) \
{ \
SInt32 __Err = (inError); \
if(__Err != 0) \
{ \
Throw(inException); \
} \
}
#if TARGET_OS_WIN32
#define ThrowIfWinError(inError, inException, inMessage) \
{ \
HRESULT __Err = (inError); \
if(FAILED(__Err)) \
{ \
Throw(inException); \
} \
}
#endif
#define SubclassResponsibility(inMethodName, inException) \
{ \
Throw(inException); \
}
#endif // defined(__cplusplus)
#endif // DEBUG || CoreAudio_Debug
#endif

View File

@ -0,0 +1,64 @@
/* Copyright: © Copyright 2005 Apple Computer, Inc. All rights reserved.
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, 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 Computer, 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.
*/
/*=============================================================================
CAMath.h
=============================================================================*/
#ifndef __CAMath_h__
#define __CAMath_h__
#if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
#include <CoreAudio/CoreAudioTypes.h>
#else
#include <CoreAudioTypes.h>
#endif
inline bool fiszero(Float64 f) { return (f == 0.); }
inline bool fiszero(Float32 f) { return (f == 0.f); }
inline bool fnonzero(Float64 f) { return !fiszero(f); }
inline bool fnonzero(Float32 f) { return !fiszero(f); }
inline bool fequal(const Float64 &a, const Float64 &b) { return a == b; }
inline bool fequal(const Float32 &a, const Float32 &b) { return a == b; }
inline bool fnotequal(const Float64 &a, const Float64 &b) { return !fequal(a, b); }
inline bool fnotequal(const Float32 &a, const Float32 &b) { return !fequal(a, b); }
#endif // __CAMath_h__

View File

@ -12,9 +12,14 @@
#include <AudioUnit/AudioUnit.h> #include <AudioUnit/AudioUnit.h>
#include <AudioToolbox/AudioToolbox.h> #include <AudioToolbox/AudioToolbox.h>
#include "CAAudioFileFormats.h"
#include "AUOutputBL.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
#define R(x) if (OSStatus r = (x)) fprintf(stderr, "%s -> %ld\n", #x, r);
class VLAUSoundOut : public VLSoundOut { class VLAUSoundOut : public VLSoundOut {
public: public:
VLAUSoundOut(); VLAUSoundOut();
@ -29,14 +34,14 @@ public:
protected: protected:
VLAUSoundOut(bool fileOutput); VLAUSoundOut(bool fileOutput);
void InitSoundOut(bool fileOutput); void InitSoundOutput(bool fileOutput);
virtual void SetupOutput(AUNode outputNode); virtual void SetupOutput(AUNode outputNode);
virtual void PlaySequence(MusicSequence music); virtual void PlaySequence(MusicSequence music);
MusicTimeStamp SequenceLength(MusicSequence music); MusicTimeStamp SequenceLength(MusicSequence music);
AUGraph fGraph; AUGraph fGraph;
private:
MusicPlayer fPlayer; MusicPlayer fPlayer;
private:
MusicSequence fMusic; MusicSequence fMusic;
bool fRunning; bool fRunning;
@ -45,7 +50,7 @@ private:
class VLAUFileSoundOut : public VLAUSoundOut { class VLAUFileSoundOut : public VLAUSoundOut {
public: public:
VLAUFileSoundOut(CFURLRef file); VLAUFileSoundOut(CFURLRef file, OSType dataFormat);
~VLAUFileSoundOut(); ~VLAUFileSoundOut();
protected: protected:
virtual void SetupOutput(AUNode outputNode); virtual void SetupOutput(AUNode outputNode);
@ -53,6 +58,7 @@ protected:
private: private:
AudioUnit fOutput; AudioUnit fOutput;
CFURLRef fFile; CFURLRef fFile;
OSType fDataFormat;
}; };
VLSoundEvent::~VLSoundEvent() VLSoundEvent::~VLSoundEvent()
@ -83,9 +89,9 @@ void VLSoundOut::SetScheduler(VLSoundScheduler * scheduler)
sSoundScheduler.reset(scheduler); sSoundScheduler.reset(scheduler);
} }
VLSoundOut * VLSoundOut::FileWriter(CFURLRef file) VLSoundOut * VLSoundOut::FileWriter(CFURLRef file, OSType dataFormat)
{ {
return new VLAUFileSoundOut(file); return new VLAUFileSoundOut(file, dataFormat);
} }
VLSoundOut::~VLSoundOut() VLSoundOut::~VLSoundOut()
@ -98,10 +104,9 @@ VLAUSoundOut::VLAUSoundOut()
InitSoundOutput(false); InitSoundOutput(false);
} }
VLAUSoundOut::VLAUSoundOut(bool fileOutput) VLAUSoundOut::VLAUSoundOut(bool)
: fRunning(false), fMusic(0) : fRunning(false), fMusic(0)
{ {
InitSoundOutput(fileOutput);
} }
VLAUSoundOut::~VLAUSoundOut() VLAUSoundOut::~VLAUSoundOut()
@ -140,22 +145,27 @@ void VLAUSoundOut::InitSoundOutput(bool fileOutput)
AUGraphNewNode(fGraph, &cd, 0, NULL, &outNode); AUGraphNewNode(fGraph, &cd, 0, NULL, &outNode);
AUGraphOpen(fGraph); R(AUGraphOpen(fGraph));
AUGraphConnectNodeInput(fGraph, synthNode, 0, limiterNode, 0); AUGraphConnectNodeInput(fGraph, synthNode, 0, limiterNode, 0);
AUGraphConnectNodeInput(fGraph, limiterNode, 0, outNode, 0); AUGraphConnectNodeInput(fGraph, limiterNode, 0, outNode, 0);
if (fileOutput) { if (fileOutput) {
UInt32 value = 1; UInt32 value = 1;
AudioUnit synth; AudioUnit synth;
AUGraphGetNodeInfo(fGraph, synthNode, 0, 0, 0, &synth) R(AUGraphGetNodeInfo(fGraph, synthNode, 0, 0, 0, &synth));
AudioUnitSetProperty(synth, R(AudioUnitSetProperty(synth,
kAudioUnitProperty_OfflineRender, kAudioUnitProperty_OfflineRender,
kAudioUnitScope_Global, 0, kAudioUnitScope_Global, 0,
&value, sizeof(value)); &value, sizeof(value)));
value = 512;
R(AudioUnitSetProperty(synth,
kAudioUnitProperty_OfflineRender,
kAudioUnitScope_Global, 0,
&value, sizeof(value)));
} }
SetupOutput(outNode); SetupOutput(outNode);
AUGraphInitialize(fGraph); R(AUGraphInitialize(fGraph));
NewMusicPlayer(&fPlayer); NewMusicPlayer(&fPlayer);
} }
@ -170,9 +180,9 @@ void VLAUSoundOut::PlaySequence(MusicSequence music)
fMusic = music; fMusic = music;
MusicSequenceSetAUGraph(fMusic, fGraph); R(MusicSequenceSetAUGraph(fMusic, fGraph));
MusicPlayerSetSequence(fPlayer, fMusic); R(MusicPlayerSetSequence(fPlayer, fMusic));
MusicPlayerStart(fPlayer); R(MusicPlayerStart(fPlayer));
fRunning = true; fRunning = true;
} }
@ -227,10 +237,8 @@ void VLAUSoundOut::Play(const int8_t * note, size_t numNotes)
void VLAUSoundOut::PlayFile(CFDataRef file) void VLAUSoundOut::PlayFile(CFDataRef file)
{ {
MusicSequence music; MusicSequence music;
MusicTrack track;
NewMusicSequence(&music); NewMusicSequence(&music);
MusicSequenceNewTrack(music, &track);
MusicSequenceLoadSMFDataWithFlags(music, file, MusicSequenceLoadSMFDataWithFlags(music, file,
kMusicSequenceLoadSMF_ChannelsToTracks); kMusicSequenceLoadSMF_ChannelsToTracks);
PlaySequence(music); PlaySequence(music);
@ -239,13 +247,13 @@ void VLAUSoundOut::PlayFile(CFDataRef file)
MusicTimeStamp VLAUSoundOut::SequenceLength(MusicSequence music) MusicTimeStamp VLAUSoundOut::SequenceLength(MusicSequence music)
{ {
UInt32 ntracks; UInt32 ntracks;
MusicSequenceGetTrackCount(sequence, &ntracks); MusicSequenceGetTrackCount(music, &ntracks);
MusicTimeStamp sequenceLength = 0; MusicTimeStamp sequenceLength = 0;
for (UInt32 i = 0; i < ntracks; ++i) { for (UInt32 i = 0; i < ntracks; ++i) {
MusicTrack track; MusicTrack track;
MusicTimeStamp trackLength; MusicTimeStamp trackLength;
UInt32 propsize = sizeof(MusicTimeStamp); UInt32 propsize = sizeof(MusicTimeStamp);
MusicSequenceGetIndTrack(sequence, i, &track); MusicSequenceGetIndTrack(music, i, &track);
MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength, MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength,
&trackLength, &propsize); &trackLength, &propsize);
sequenceLength = std::max(sequenceLength, trackLength); sequenceLength = std::max(sequenceLength, trackLength);
@ -253,9 +261,11 @@ MusicTimeStamp VLAUSoundOut::SequenceLength(MusicSequence music)
return sequenceLength; return sequenceLength;
} }
VLAUFileSoundOut::VLAUFileSoundOut(CFURLRef file) VLAUFileSoundOut::VLAUFileSoundOut(CFURLRef file, OSType dataFormat)
: VLAUSoundOut(true), fFile(file) : VLAUSoundOut(true), fFile(file), fDataFormat(dataFormat)
{ {
InitSoundOutput(true);
CFRetain(fFile); CFRetain(fFile);
} }
@ -266,33 +276,43 @@ VLAUFileSoundOut::~VLAUFileSoundOut()
void VLAUFileSoundOut::SetupOutput(AUNode outputNode) void VLAUFileSoundOut::SetupOutput(AUNode outputNode)
{ {
AUGraphGetNodeInfo(fGraph, outputNode, 0, 0, 0, &fOutput); R(AUGraphGetNodeInfo(fGraph, outputNode, 0, 0, 0, &fOutput));
Float64 sampleRate = 22050.0; Float64 sampleRate = 22050.0;
AudioUnitSetProperty(fOutput, R(AudioUnitSetProperty(fOutput,
kAudioUnitProperty_SampleRate, kAudioUnitProperty_SampleRate,
kAudioUnitScope_Output, 0, kAudioUnitScope_Output, 0,
&sampleRate, sizeof(sampleRate)); &sampleRate, sizeof(sampleRate)));
} }
void VLAUFileSoundOut::PlaySequence(MusicSequence music) void VLAUFileSoundOut::PlaySequence(MusicSequence music)
{ {
SInt32 urlErr; SInt32 urlErr;
CFURLDestroyResource(fFile, &urlErr); CFURLDestroyResource(fFile, &urlErr);
OSStatus result = 0;
UInt32 size; UInt32 size;
UInt32 numFrames = 512;
MusicTimeStamp musicLen = SequenceLength(music)+8; MusicTimeStamp musicLen = SequenceLength(music)+8;
CFStringRef name = CFStringRef name =
CFURLCopyLastPathComponent(fFile); CFURLCopyLastPathComponent(fFile);
CAAudioFileFormats formats = CAAudioFileFormats::Instance(); CAAudioFileFormats * formats = CAAudioFileFormats::Instance();
AudioFileTypeID fileType; AudioFileTypeID fileType;
formats->InferFileFormatFromFilename(name, fileType); formats->InferFileFormatFromFilename(name, fileType);
CAStreamBasicDescription outputFormat; CAStreamBasicDescription outputFormat;
formats->InferDataFormatFromFileFormat(fileType, outputFormat); if (fDataFormat)
outputFormat.mFormatID = fDataFormat;
else if (!formats->InferDataFormatFromFileFormat(fileType, outputFormat))
switch (fileType) {
case kAudioFileM4AType:
outputFormat.mFormatID = kAudioFormatMPEG4AAC;
break;
default:
outputFormat.mFormatID = kAudioFormatLinearPCM;
break;
}
outputFormat.mChannelsPerFrame = 2; outputFormat.mChannelsPerFrame = 2;
outputFormat.mSampleRate = 22050.0;
if (outputFormat.mFormatID == kAudioFormatLinearPCM) { if (outputFormat.mFormatID == kAudioFormatLinearPCM) {
outputFormat.mBytesPerPacket = outputFormat.mChannelsPerFrame * 2; outputFormat.mBytesPerPacket = outputFormat.mChannelsPerFrame * 2;
outputFormat.mFramesPerPacket = 1; outputFormat.mFramesPerPacket = 1;
@ -309,8 +329,8 @@ void VLAUFileSoundOut::PlaySequence(MusicSequence music)
} else { } else {
// use AudioFormat API to fill out the rest. // use AudioFormat API to fill out the rest.
size = sizeof(outputFormat); size = sizeof(outputFormat);
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, R(AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL,
&size, &outputFormat); &size, &outputFormat));
} }
CFURLRef dir = CFURLRef dir =
@ -320,52 +340,39 @@ void VLAUFileSoundOut::PlaySequence(MusicSequence music)
CFRelease(dir); CFRelease(dir);
ExtAudioFileRef outfile; ExtAudioFileRef outfile;
ExtAudioFileCreateNew(&parentDir, name, R(ExtAudioFileCreateNew(&parentDir, name,
fileType, &outputFormat, NULL, &outfile); fileType, &outputFormat, NULL, &outfile));
CFRelease(name); CFRelease(name);
{ CAStreamBasicDescription clientFormat;
CAStreamBasicDescription clientFormat; size = sizeof(clientFormat);
size = sizeof(clientFormat); R(AudioUnitGetProperty(fOutput, kAudioUnitProperty_StreamFormat,
require_noerr (result = AudioUnitGetProperty (outputUnit, kAudioUnitScope_Output, 0, &clientFormat, &size));
kAudioUnitProperty_StreamFormat, clientFormat.Print(stderr);
kAudioUnitScope_Output, 0, R(ExtAudioFileSetProperty(outfile, kExtAudioFileProperty_ClientDataFormat,
&clientFormat, &size), fail); size, &clientFormat));
size = sizeof(clientFormat);
require_noerr (result = ExtAudioFileSetProperty(outfile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat), fail);
{
MusicTimeStamp currentTime;
AUOutputBL outputBuffer (clientFormat, numFrames);
AudioTimeStamp tStamp;
memset (&tStamp, 0, sizeof(AudioTimeStamp));
tStamp.mFlags = kAudioTimeStampSampleTimeValid;
int i = 0;
int numTimesFor10Secs = (int)(10. / (numFrames / srate));
do {
outputBuffer.Prepare();
AudioUnitRenderActionFlags actionFlags = 0;
require_noerr (result = AudioUnitRender (outputUnit, &actionFlags, &tStamp, 0, numFrames, outputBuffer.ABL()), fail);
tStamp.mSampleTime += numFrames; VLAUSoundOut::PlaySequence(music);
MusicTimeStamp currentTime;
AUOutputBL outputBuffer (clientFormat, numFrames);
AudioTimeStamp tStamp;
memset (&tStamp, 0, sizeof(AudioTimeStamp));
tStamp.mFlags = kAudioTimeStampSampleTimeValid;
do {
outputBuffer.Prepare();
AudioUnitRenderActionFlags actionFlags = 0;
R(AudioUnitRender(fOutput, &actionFlags, &tStamp, 0, numFrames,
outputBuffer.ABL()));
tStamp.mSampleTime += numFrames;
require_noerr (result = ExtAudioFileWrite(outfile, numFrames, outputBuffer.ABL()), fail); R(ExtAudioFileWrite(outfile, numFrames, outputBuffer.ABL()));
require_noerr (result = MusicPlayerGetTime (player, &currentTime), fail); MusicPlayerGetTime (fPlayer, &currentTime);
if (shouldPrint && (++i % numTimesFor10Secs == 0)) } while (currentTime < musicLen);
printf ("current time: %6.2f beats\n", currentTime);
} while (currentTime < sequenceLength);
}
}
// close
ExtAudioFileDispose(outfile); ExtAudioFileDispose(outfile);
return;
fail:
printf ("Problem: %ld\n", result);
exit(1);
} }

View File

@ -29,7 +29,7 @@ public:
class VLSoundOut { class VLSoundOut {
public: public:
static VLSoundOut * Instance(); static VLSoundOut * Instance();
static VLSoundOut * FileWriter(CFURLRef file); static VLSoundOut * FileWriter(CFURLRef file, OSType dataFormat);
static void SetScheduler(VLSoundScheduler * scheduler); static void SetScheduler(VLSoundScheduler * scheduler);