src/cdrom/macosx/AudioFilePlayer.h
author Ryan C. Gordon <icculus@icculus.org>
Thu, 22 Sep 2005 08:48:16 +0000
changeset 1143 71a2648acc75
parent 935 f8d5ddc7aef1
child 1402 d910939febfa
permissions -rw-r--r--
Replaced Mac OS X's C++ cdrom code with almost-direct translation to C. Sam
requested this effort on the mailing list, apparently because of binary
compatibility issues between 10.4 and earlier systems (or gcc4 and earlier
compilers?).

Works fine with SDL12/test/testcdrom.c, with this command line:

./testcdrom -status -list -play -sleep 5000 -pause -sleep 3000 -resume \
-sleep 5000 -stop -sleep 3000 -play -sleep 3000 -stop \
-sleep 3000 -eject

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