1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2004 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 37 #include "SDL_error.h" 38 39 const char* AudioFilePlayerErrorStr (OSStatus error); 40 41 /* 42 void ThrowResult (OSStatus result, const char *str); 43 44 #define THROW_RESULT(str) \ 45 if (result) { \ 46 ThrowResult (result, str); \ 47 } 48 */ 49 50 typedef void (*AudioFilePlayNotifier)(void *inRefCon, 51 OSStatus inStatus); 52 53 enum { 54 kAudioFilePlayErr_FilePlayUnderrun = -10000, 55 kAudioFilePlay_FileIsFinished = -10001, 56 kAudioFilePlay_PlayerIsUninitialized = -10002 57 }; 58 59 60 struct S_AudioFileManager; 61 62 #pragma mark __________ AudioFilePlayer 63 typedef struct S_AudioFilePlayer 64 { 65 /*public:*/ 66 int (*SetDestination)(struct S_AudioFilePlayer *afp, AudioUnit *inDestUnit); 67 void (*SetNotifier)(struct S_AudioFilePlayer *afp, AudioFilePlayNotifier inNotifier, void *inRefCon); 68 void (*SetStartFrame)(struct S_AudioFilePlayer *afp, int frame); /* seek in the file */ 69 int (*GetCurrentFrame)(struct S_AudioFilePlayer *afp); /* get the current frame position */ 70 void (*SetStopFrame)(struct S_AudioFilePlayer *afp, int frame); /* set limit in the file */ 71 int (*Connect)(struct S_AudioFilePlayer *afp); 72 void (*Disconnect)(struct S_AudioFilePlayer *afp); 73 void (*DoNotification)(struct S_AudioFilePlayer *afp, OSStatus inError); 74 int (*IsConnected)(struct S_AudioFilePlayer *afp); 75 AudioUnit (*GetDestUnit)(struct S_AudioFilePlayer *afp); 76 void (*Print)(struct S_AudioFilePlayer *afp); 77 78 /*private:*/ 79 AudioUnit mPlayUnit; 80 SInt16 mForkRefNum; 81 82 AudioUnitInputCallback mInputCallback; 83 84 AudioStreamBasicDescription mFileDescription; 85 86 int mConnected; 87 88 struct S_AudioFileManager* mAudioFileManager; 89 90 AudioFilePlayNotifier mNotifier; 91 void* mRefCon; 92 93 int mStartFrame; 94 95 #pragma mark __________ Private_Methods 96 97 int (*OpenFile)(struct S_AudioFilePlayer *afp, const FSRef *inRef, SInt64 *outFileSize); 98 } AudioFilePlayer; 99 100 101 AudioFilePlayer *new_AudioFilePlayer(const FSRef *inFileRef); 102 void delete_AudioFilePlayer(AudioFilePlayer *afp); 103 104 105 106 #pragma mark __________ AudioFileManager 107 typedef struct S_AudioFileManager 108 { 109 /*public:*/ 110 /* this method should NOT be called by an object of this class 111 as it is called by the parent's Disconnect() method */ 112 void (*Disconnect)(struct S_AudioFileManager *afm); 113 int (*DoConnect)(struct S_AudioFileManager *afm); 114 OSStatus (*Read)(struct S_AudioFileManager *afm, char *buffer, UInt32 *len); 115 const char* (*GetFileBuffer)(struct S_AudioFileManager *afm); 116 const AudioFilePlayer *(*GetParent)(struct S_AudioFileManager *afm); 117 void (*SetPosition)(struct S_AudioFileManager *afm, SInt64 pos); /* seek/rewind in the file */ 118 int (*GetByteCounter)(struct S_AudioFileManager *afm); /* return actual bytes streamed to audio hardware */ 119 void (*SetEndOfFile)(struct S_AudioFileManager *afm, SInt64 pos); /* set the "EOF" (will behave just like it reached eof) */ 120 121 /*protected:*/ 122 AudioFilePlayer* mParent; 123 SInt16 mForkRefNum; 124 SInt64 mAudioDataOffset; 125 126 char* mFileBuffer; 127 128 int mByteCounter; 129 130 int mReadFromFirstBuffer; 131 int mLockUnsuccessful; 132 int mIsEngaged; 133 134 int mNumTimesAskedSinceFinished; 135 136 137 void* mTmpBuffer; 138 UInt32 mBufferSize; 139 UInt32 mBufferOffset; 140 /*public:*/ 141 UInt32 mChunkSize; 142 SInt64 mFileLength; 143 SInt64 mReadFilePosition; 144 int mWriteToFirstBuffer; 145 int mFinishedReadingData; 146 147 /*protected:*/ 148 OSStatus (*Render)(struct S_AudioFileManager *afm, AudioBuffer *ioData); 149 OSStatus (*GetFileData)(struct S_AudioFileManager *afm, void** inOutData, UInt32 *inOutDataSize); 150 void (*AfterRender)(struct S_AudioFileManager *afm); 151 152 /*public:*/ 153 /*static*/ 154 OSStatus (*FileInputProc)(void *inRefCon, 155 AudioUnitRenderActionFlags inActionFlags, 156 const AudioTimeStamp *inTimeStamp, 157 UInt32 inBusNumber, 158 AudioBuffer *ioData); 159 } AudioFileManager; 160 161 162 AudioFileManager *new_AudioFileManager (AudioFilePlayer *inParent, 163 SInt16 inForkRefNum, 164 SInt64 inFileLength, 165 UInt32 inChunkSize); 166 167 void delete_AudioFileManager(AudioFileManager *afm); 168 169 #endif 170 171