view src/cdrom/macosx/AudioFilePlayer.h @ 3769:fe32943f86ec gsoc2008_manymouse

Project part 2
author Szymon Wilczek <kazeuser@gmail.com>
date Wed, 30 Jul 2008 16:20:32 +0000
parents 6359f74f3170
children 99210400e8b9
line wrap: on
line source

/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2004 Sam Lantinga

    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
*/
#include "SDL_config.h"

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    AudioFilePlayer.h
*/
#ifndef __AudioFilePlayer_H__
#define __AudioFilePlayer_H__

#include <CoreServices/CoreServices.h>

#include <AudioUnit/AudioUnit.h>
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
#include <AudioUnit/AUNTComponent.h>
#endif

#include "SDL_error.h"

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
};


struct S_AudioFileManager;

#pragma mark __________ AudioFilePlayer
typedef struct S_AudioFilePlayer
{
/*public:*/
    int (*SetDestination) (struct S_AudioFilePlayer * afp,
                           AudioUnit * inDestUnit);
    void (*SetNotifier) (struct S_AudioFilePlayer * afp,
                         AudioFilePlayNotifier inNotifier, void *inRefCon);
    void (*SetStartFrame) (struct S_AudioFilePlayer * afp, int frame);  /* seek in the file */
    int (*GetCurrentFrame) (struct S_AudioFilePlayer * afp);    /* get the current frame position */
    void (*SetStopFrame) (struct S_AudioFilePlayer * afp, int frame);   /* set limit in the file */
    int (*Connect) (struct S_AudioFilePlayer * afp);
    void (*Disconnect) (struct S_AudioFilePlayer * afp);
    void (*DoNotification) (struct S_AudioFilePlayer * afp, OSStatus inError);
    int (*IsConnected) (struct S_AudioFilePlayer * afp);
      AudioUnit(*GetDestUnit) (struct S_AudioFilePlayer * afp);
    void (*Print) (struct S_AudioFilePlayer * afp);

/*private:*/
    AudioUnit mPlayUnit;
    SInt16 mForkRefNum;

    AudioUnitInputCallback mInputCallback;

    AudioStreamBasicDescription mFileDescription;

    int mConnected;

    struct S_AudioFileManager *mAudioFileManager;

    AudioFilePlayNotifier mNotifier;
    void *mRefCon;

    int mStartFrame;

#pragma mark __________ Private_Methods

    int (*OpenFile) (struct S_AudioFilePlayer * afp, const FSRef * inRef,
                     SInt64 * outFileSize);
} AudioFilePlayer;


AudioFilePlayer *new_AudioFilePlayer(const FSRef * inFileRef);
void delete_AudioFilePlayer(AudioFilePlayer * afp);



#pragma mark __________ AudioFileManager
typedef struct S_AudioFileManager
{
/*public:*/
    /* this method should NOT be called by an object of this class
       as it is called by the parent's Disconnect() method */
    void (*Disconnect) (struct S_AudioFileManager * afm);
    int (*DoConnect) (struct S_AudioFileManager * afm);
      OSStatus(*Read) (struct S_AudioFileManager * afm, char *buffer,
                       UInt32 * len);
    const char *(*GetFileBuffer) (struct S_AudioFileManager * afm);
    const AudioFilePlayer *(*GetParent) (struct S_AudioFileManager * afm);
    void (*SetPosition) (struct S_AudioFileManager * afm, SInt64 pos);  /* seek/rewind in the file */
    int (*GetByteCounter) (struct S_AudioFileManager * afm);    /* return actual bytes streamed to audio hardware */
    void (*SetEndOfFile) (struct S_AudioFileManager * afm, SInt64 pos); /* set the "EOF" (will behave just like it reached eof) */

/*protected:*/
    AudioFilePlayer *mParent;
    SInt16 mForkRefNum;
    SInt64 mAudioDataOffset;

    char *mFileBuffer;

    int mByteCounter;

    int mReadFromFirstBuffer;
    int mLockUnsuccessful;
    int mIsEngaged;

    int mNumTimesAskedSinceFinished;


    void *mTmpBuffer;
    UInt32 mBufferSize;
    UInt32 mBufferOffset;
/*public:*/
    UInt32 mChunkSize;
    SInt64 mFileLength;
    SInt64 mReadFilePosition;
    int mWriteToFirstBuffer;
    int mFinishedReadingData;

/*protected:*/
      OSStatus(*Render) (struct S_AudioFileManager * afm,
                         AudioBuffer * ioData);
      OSStatus(*GetFileData) (struct S_AudioFileManager * afm,
                              void **inOutData, UInt32 * inOutDataSize);
    void (*AfterRender) (struct S_AudioFileManager * afm);

/*public:*/
    /*static */
      OSStatus(*FileInputProc) (void *inRefCon,
                                AudioUnitRenderActionFlags inActionFlags,
                                const AudioTimeStamp * inTimeStamp,
                                UInt32 inBusNumber, AudioBuffer * ioData);
} AudioFileManager;


AudioFileManager *new_AudioFileManager(AudioFilePlayer * inParent,
                                       SInt16 inForkRefNum,
                                       SInt64 inFileLength,
                                       UInt32 inChunkSize);

void delete_AudioFileManager(AudioFileManager * afm);

#endif
/* vi: set ts=4 sw=4 expandtab: */