Home | History | Annotate | Download | only in macosx
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2012 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 #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1050
     37 #include <AudioUnit/AUNTComponent.h>
     38 #endif
     39 
     40 #if (MAC_OS_X_VERSION_MAX_ALLOWED < 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 
    179