e14743d1 |
1 | /* |
2 | SDL - Simple DirectMedia Layer |
3 | Copyright (C) 1997-2009 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_MIN_REQUIRED < 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 | |