/*
 *  AudioHardwareMux.h
 *  Apple02Audio
 *
 *  Created by cerveau on Sat Feb 03 2001.
 *  Copyright (c) 2001 Apple Computer, Inc. All rights reserved.
 *
 */

#ifndef _AUDIOHARDWAREMUXES_H
#define _AUDIOHARDWAREMUXES_H

#include "AudioHardwareCommon.h"
#include "AudioHardwareUtilities.h"
#include "Apple02Audio.h"


// Kind of muxes
enum{
    kAudioHardwareMuxUnknown = 0,
    kAudioHardwareMuxWS  = 1,
    kAudioHardwareMux101 = 2,
    kAudioHardwareMuxPO  = 3			// for FireWire PowerBook and probably PowerBook G4, if my I remember well
};

// structure for the MuxProgOut
struct MuxSourceMap {
	UInt32		source;
	UInt32		bitMask;
	UInt32		bitMatch;
};
typedef struct MuxSourceMap MuxSourceMap;
   
typedef struct _s_AudioHardwareMuxInfo {
    UInt32	MuxPortType;
    
    UInt32		MuxPOnumSources;
    MuxSourceMap	MuxPOsources[2];
}AudioHardwareMuxInfo;

// constant for the MuxWallStreet
enum  {
    kWSMuxMediaBayInput			=	0x00000000,				// media bay input enable
    kWSMuxCommsInput			=	0x00000010,				// comms input enable
    kWSMuxDockInput				=	0x00000020,				// dock input enable
    kWSMuxZoomVideoInput		=	0x00000030,				// zoom video input enable
    kWSMuxMuxFieldMask			=	0x00000030,				// mask of all possible mux settings
		
    kWSMuxChanCOn				=	0x02,					// turn on mux enable for channel C
    kWSMuxChanCOff				=	0x0A,					// turn off mux enable for channel C
    kWSMuxChanCIsOffMask		=	0x20,					// mask to test to see if channel C is off
    kWSMuxChanCEnableAddr		=	0xF3000037,				// address to hit to enable mux for channel C
    kWSMuxExternalAddress		=	0xF301B000,				// address to read to make mux settings take effect
		
    kWSMuxDelay					=	0x110,					// ms delay for mux setting to take effect
    kWSMuxMClkDelay				=	2,						// ms delay for leaving mclk off so that DAC can switch from internal to external mode
		
    kWSMuxOff					=	0,						// tell callback to turn mux off
    kWSMuxOn					=	1						// tell callback to turn mux on
};

// constant for the Mux 101
enum  {
    k101MuxMediaBayInput		=	0x01,					// media bay input enable
    k101MuxZoomVideoInput		=	0x00,					// zoom video input enable
    k101MuxInternalMicInput		=	0x01,					// internal mic input enable
    k101MuxInternalModemInput	=	0x00,					// internal modem input enable
		
    k101MuxChanCOn				=	0x02, 					// turn on mux enable for channel C
    k101MuxChanCOff				=	0x00,					// turn off mux enable for channel C
    k101MuxClearChanCBitsMask	=	~0x0B,					// clear bit 3 (data) and low two bits (chancon and mux select)
    k101MuxChanCIsOffMask		=	0x20,					// mask to test to see if channel C is off
    k101MuxDefaultIOBaseAddress	=	0x80800000,				// base address of IO controller
    k101MuxChanCEnableOffset	=	0x00000037,				// offset from start of IO controller to mux control register
				
    k101AnalogMuxDelay			=	320,					// ms delay for analog mux setting to take effect
    k101DigitalMuxDelay			=	775,					// ms delay for digital mux setting to take effect (yes, the CS4334 takes a long time!)
    k101MuxMClkDelay			=	2,						// ms delay for leaving mclk off so that DAC can switch from internal to external mode
		
    k101MuxOff					=	0,						// tell callback to turn mux off
    k101MuxOn					=	1						// tell callback to turn mux on
};

// As we don't have a lot to support we do know a class that takes care of these three muxes
    
class AudioHardwareMux : public OSObject {
    OSDeclareDefaultStructors(AudioHardwareMux);

public:
    static AudioHardwareMux *create(AudioHardwareMuxInfo theMuxInfo); 
    void attachAudioPluginRef(Apple02Audio *theAudioPlugin);
    
    UInt32   GetMuxSource();
    IOReturn SetMuxSource(UInt32 source );
     void ioLog();

protected:
    bool init(AudioHardwareMuxInfo theOutputInfo);
    void free();

        
    UInt32	MuxPortType;
    UInt32	lastSource;		// last source set on mux

	// WSMux specific
    UInt32 	WSMuxhwSetting;	// only one of these shared for all mux instances;this should be a static
    UInt32	   	WSMuxscratch;	// scratch variable to cause read to mux control location
    UInt8		WSMuxchanCSetting;	// what to set the channel C
        
	// Mux101 specific (nothing should be passed to constructor)
    UInt8		*Mux101chanCEnableAddr;	// address to hit to set mux for input C
    UInt8		Mux101chanCSetting;	// what to set the mux control to

	// MuxProgOut specific (the Map should be pass to the constructor)
    UInt32		MuxPOnumSources;
    MuxSourceMap	MuxPOsources[2];   //we should make it a pointer but we know there is 2 to take care until now		
    Apple02Audio *pluginRef;

};

#endif
