TextFileMIDIDevice.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "MIDIIn.hxx"
00023 #include <stdio.h>
00024 #include "MIDIDeviceList.hxx"
00025 #include "MIDIDevice.hxx"
00026
00027 namespace CLAM {
00028
00029 class TextFileMIDIDevice: public MIDIDevice
00030 {
00031 private:
00032 std::string mDevice;
00033 FILE* mOut;
00034 FILE* mIn;
00035 TControlData mClock;
00036 public:
00037 TextFileMIDIDevice(const std::string& name,const std::string& device);
00038 ~TextFileMIDIDevice();
00039
00040 void ConcreteStart(void) throw(Err);
00041 void ConcreteStop(void) throw(Err);
00042
00043 void Read(void) throw(Err);
00044 void Write(unsigned char* msg,int size) throw(Err);
00045
00046 void SetClock(TControlData val) { mClock = val; }
00047
00048 };
00049
00050 TextFileMIDIDevice::TextFileMIDIDevice(const std::string& name,const std::string& device):
00051 MIDIDevice(name)
00052 {
00053 mDevice = device;
00054 mOut = 0;
00055 mIn = 0;
00056 mClock = 0;
00057 }
00058
00059 void TextFileMIDIDevice::ConcreteStart(void) throw(Err)
00060 {
00061 if (mOut) fclose(mOut);
00062 if (mIn) fclose(mIn);
00063
00064 mIn = 0;
00065 mOut = 0;
00066
00067 if (mInputs.size() && mOutputs.size() && mDevice!="-")
00068 {
00069 throw Err("TextFileMIDIDevice: Cannot use the same file for reading and writing");
00070 }
00071 if (mInputs.size())
00072 {
00073 if (mDevice == "-")
00074 mIn = stdin;
00075 else
00076 mIn = fopen(mDevice.c_str(),"r");
00077 }
00078 if (mOutputs.size())
00079 {
00080 if (mDevice == "-")
00081 mOut = stdout;
00082 else
00083 mOut = fopen(mDevice.c_str(),"w");
00084 }
00085 }
00086
00087 void TextFileMIDIDevice::ConcreteStop(void) throw(Err)
00088 {
00089 if (mOut) fclose(mOut);
00090 if (mIn) fclose(mOut);
00091 mOut = 0;
00092 mIn = 0;
00093 }
00094
00095 void TextFileMIDIDevice::Write(unsigned char* msg,int size) throw(Err)
00096 {
00097 printf("TextFileMIDIDevice::Write:");
00098 printf("%f",mClock);
00099 for (int i=0;i<size;i++)
00100 {
00101 printf(" 0x%02x",msg[i]);
00102 }
00103 printf("\n");
00104 fflush(stdout);
00105
00106 fprintf(mOut,"%f",mClock);
00107 for (int i=0;i<size;i++)
00108 {
00109 fprintf(mOut," 0x%02x",msg[i]);
00110 }
00111 fprintf(mOut,"\n");
00112 }
00113
00114 void TextFileMIDIDevice::Read(void) throw(Err)
00115 {
00116 }
00117
00118 TextFileMIDIDevice::~TextFileMIDIDevice()
00119 {
00120 Stop();
00121 }
00122
00123 class TextFileMIDIDeviceList: public MIDIDeviceList
00124 {
00125 static TextFileMIDIDeviceList sDevices;
00126
00127 TextFileMIDIDeviceList()
00128 :MIDIDeviceList(std::string("textfile"))
00129 {
00130 mAvailableDevices.push_back("-");
00131
00132 AddMe();
00133 }
00134 public:
00135
00136 std::string DefaultDevice(void)
00137 {
00138 return "-";
00139 }
00140
00141 MIDIDevice* Create(
00142 const std::string& name,const std::string& device)
00143 {
00144 return new TextFileMIDIDevice(name,device);
00145 }
00146 };
00147
00148 TextFileMIDIDeviceList TextFileMIDIDeviceList::sDevices;
00149 }
00150