Skip to content

Latest commit

 

History

History
211 lines (146 loc) · 6.77 KB

AudioFilePlayer.h

File metadata and controls

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