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@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