1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Library General Public 7 License as published by the Free Software Foundation; either 8 version 2 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Library General Public License for more details. 14 15 You should have received a copy of the GNU Library General Public 16 License along with this library; if not, write to the Free 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 22 This file based on Apple sample code. We haven't changed the file name, 23 so if you want to see the original search for it on apple.com/developer 24 */ 25 #include "SDL_config.h" 26 27 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 28 AudioFilePlayer.h 29 */ 30 #ifndef __AudioFilePlayer_H__ 31 #define __AudioFilePlayer_H__ 32 33 #include <CoreServices/CoreServices.h> 34 35 #include <AudioUnit/AudioUnit.h> 36 #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1050 37 #include <AudioUnit/AUNTComponent.h> 38 #endif 39 40 #if (MAC_OS_X_VERSION_MAX_ALLOWED < 1050) 41 typedef SInt16 FSIORefNum; 42 #endif 43 44 #include "SDL_error.h" 45 46 const char* AudioFilePlayerErrorStr (OSStatus error); 47 48 /* 49 void ThrowResult (OSStatus result, const char *str); 50 51 #define THROW_RESULT(str) \ 52 if (result) { \ 53 ThrowResult (result, str); \ 54 } 55 */ 56 57 typedef void (*AudioFilePlayNotifier)(void *inRefCon, 58 OSStatus inStatus); 59 60 enum { 61 kAudioFilePlayErr_FilePlayUnderrun = -10000, 62 kAudioFilePlay_FileIsFinished = -10001, 63 kAudioFilePlay_PlayerIsUninitialized = -10002 64 }; 65 66 67 struct S_AudioFileManager; 68 69 #pragma mark __________ AudioFilePlayer 70 typedef struct S_AudioFilePlayer 71 { 72 /*public:*/ 73 int (*SetDestination)(struct S_AudioFilePlayer *afp, AudioUnit *inDestUnit); 74 void (*SetNotifier)(struct S_AudioFilePlayer *afp, AudioFilePlayNotifier inNotifier, void *inRefCon); 75 void (*SetStartFrame)(struct S_AudioFilePlayer *afp, int frame); /* seek in the file */ 76 int (*GetCurrentFrame)(struct S_AudioFilePlayer *afp); /* get the current frame position */ 77 void (*SetStopFrame)(struct S_AudioFilePlayer *afp, int frame); /* set limit in the file */ 78 int (*Connect)(struct S_AudioFilePlayer *afp); 79 void (*Disconnect)(struct S_AudioFilePlayer *afp); 80 void (*DoNotification)(struct S_AudioFilePlayer *afp, OSStatus inError); 81 int (*IsConnected)(struct S_AudioFilePlayer *afp); 82 AudioUnit (*GetDestUnit)(struct S_AudioFilePlayer *afp); 83 void (*Print)(struct S_AudioFilePlayer *afp); 84 85 /*private:*/ 86 AudioUnit mPlayUnit; 87 FSIORefNum mForkRefNum; 88 89 AURenderCallbackStruct mInputCallback; 90 91 AudioStreamBasicDescription mFileDescription; 92 93 int mConnected; 94 95 struct S_AudioFileManager* mAudioFileManager; 96 97 AudioFilePlayNotifier mNotifier; 98 void* mRefCon; 99 100 int mStartFrame; 101 102 #pragma mark __________ Private_Methods 103 104 int (*OpenFile)(struct S_AudioFilePlayer *afp, const FSRef *inRef, SInt64 *outFileSize); 105 } AudioFilePlayer; 106 107 108 AudioFilePlayer *new_AudioFilePlayer(const FSRef *inFileRef); 109 void delete_AudioFilePlayer(AudioFilePlayer *afp); 110 111 112 113 #pragma mark __________ AudioFileManager 114 typedef struct S_AudioFileManager 115 { 116 /*public:*/ 117 /* this method should NOT be called by an object of this class 118 as it is called by the parent's Disconnect() method */ 119 void (*Disconnect)(struct S_AudioFileManager *afm); 120 int (*DoConnect)(struct S_AudioFileManager *afm); 121 OSStatus (*Read)(struct S_AudioFileManager *afm, char *buffer, ByteCount *len); 122 const char* (*GetFileBuffer)(struct S_AudioFileManager *afm); 123 const AudioFilePlayer *(*GetParent)(struct S_AudioFileManager *afm); 124 void (*SetPosition)(struct S_AudioFileManager *afm, SInt64 pos); /* seek/rewind in the file */ 125 int (*GetByteCounter)(struct S_AudioFileManager *afm); /* return actual bytes streamed to audio hardware */ 126 void (*SetEndOfFile)(struct S_AudioFileManager *afm, SInt64 pos); /* set the "EOF" (will behave just like it reached eof) */ 127 128 /*protected:*/ 129 AudioFilePlayer* mParent; 130 SInt16 mForkRefNum; 131 SInt64 mAudioDataOffset; 132 133 char* mFileBuffer; 134 135 int mByteCounter; 136 137 int mReadFromFirstBuffer; 138 int mLockUnsuccessful; 139 int mIsEngaged; 140 141 int mNumTimesAskedSinceFinished; 142 143 144 void* mTmpBuffer; 145 UInt32 mBufferSize; 146 UInt32 mBufferOffset; 147 /*public:*/ 148 UInt32 mChunkSize; 149 SInt64 mFileLength; 150 SInt64 mReadFilePosition; 151 int mWriteToFirstBuffer; 152 int mFinishedReadingData; 153 154 /*protected:*/ 155 OSStatus (*Render)(struct S_AudioFileManager *afm, AudioBufferList *ioData); 156 OSStatus (*GetFileData)(struct S_AudioFileManager *afm, void** inOutData, UInt32 *inOutDataSize); 157 void (*AfterRender)(struct S_AudioFileManager *afm); 158 159 /*public:*/ 160 /*static*/ 161 OSStatus (*FileInputProc)(void *inRefCon, 162 AudioUnitRenderActionFlags *ioActionFlags, 163 const AudioTimeStamp *inTimeStamp, 164 UInt32 inBusNumber, 165 UInt32 inNumberFrames, 166 AudioBufferList *ioData); 167 } AudioFileManager; 168 169 170 AudioFileManager *new_AudioFileManager (AudioFilePlayer *inParent, 171 SInt16 inForkRefNum, 172 SInt64 inFileLength, 173 UInt32 inChunkSize); 174 175 void delete_AudioFileManager(AudioFileManager *afm); 176 177 #endif 178 179