• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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