Home | History | Annotate | Download | only in macosx
      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 (at) 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