
#ifndef __InputPlayer_H__
#define __InputPlayer_H__

#include "AudioRingBuffer3.h"
#include "arplayer.h"

#include <CoreAudio/CoreAudio.h>
#include <AudioToolbox/AudioToolbox.h>
#include <AudioUnit/AudioUnit.h>
#include <string>
#include <map>
using namespace std;

class lineInDef 
{
public:
    lineInDef(void);
    void set(string UID, unsigned long, long[], unsigned long, unsigned long);
    ~lineInDef(void);
	
    string 	deviceUID;
    unsigned long	bus;
    long 	*channelMap;
	unsigned long startMIDI;
	unsigned long stopMIDI;
};

typedef map<string, lineInDef, less<string> > input_map;
typedef map<string, lineInDef, less<string> >::iterator input_map_ptr;

class InputPlayer: public ARPlayer 
{
public:
    InputPlayer(unsigned long);
    ~InputPlayer(void);
    unsigned char load(string, long*);
    void start(void);
    void stop(void);
	void volChange(float);
    void setPosition(float);
    void setStatus(unsigned long);

    unsigned char IsRunning();
	unsigned long startMIDI;
	unsigned long stopMIDI;
	AudioDeviceID devID;
	long * chanMap;

private:	
    AudioBufferList *mInputBuffer;
    AudioRingBuffer *mBuffer;
    AudioUnit mConverterUnit;
    AudioUnit mInputUnit;
    double FirstInputTime;
    double FirstOutputTime;
    double EndInputTime;
    double TargetLatency;
    double IOOffset;
    double errorFactor;
    unsigned long inbufferSizeFrames;
    unsigned long safteyFrames;
    AudioStreamBasicDescription inFormat;
    AudioStreamBasicDescription outFormat;

    OSStatus SetupAudio(AudioDeviceID, long*);
    unsigned char SetupBuffers(void);
    static OSStatus FillBuffer(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, unsigned long, unsigned long, AudioBufferList*);
    static OSStatus ReadBuffer(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, unsigned long, unsigned long, AudioBufferList*);
};

#endif //__InputPlayer_H__
