libkmid.cc00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "libkmid.h"
00029 #include <stdlib.h>
00030 #include <unistd.h>
00031 #include <signal.h>
00032 #include <sys/types.h>
00033 #include <sys/wait.h>
00034 #include <sys/shm.h>
00035
00036 #include "deviceman.h"
00037 #include "player.h"
00038 #include "midimapper.h"
00039
00040 struct kMidData kMid;
00041
00042 int KMidSimpleAPI::kMidInit(void)
00043 {
00044 kMid.midi = new DeviceManager();
00045 if ( kMid.midi == 0L ) return 1;
00046 kMid.midi->initManager();
00047 if (!kMid.midi->ok()) return 1;
00048
00049 kMid.pctlsmID=shmget(getpid(),sizeof(PlayerController),0600 | IPC_CREAT);
00050 if (kMid.pctlsmID==-1) return 1;
00051 kMid.pctl=(PlayerController *)shmat(kMid.pctlsmID,NULL,0);
00052 if (kMid.pctl==NULL) return 1;
00053
00054 kMid.player=new MidiPlayer(kMid.midi,kMid.pctl);
00055 if ( kMid.player == 0L )
00056 {
00057 delete kMid.midi;
00058 return 1;
00059 }
00060
00061 kMid.player->setParseSong(false);
00062
00063 kMid.pctl->message=0;
00064 kMid.pctl->gm=1;
00065 kMid.pctl->error=0;
00066 kMid.pctl->ratioTempo=1.0;
00067 kMid.pctl->tempo=500000;
00068 kMid.pctl->volumepercentage=100;
00069 for (int i=0;i<16;i++)
00070 {
00071 kMid.pctl->forcepgm[i]=0;
00072 kMid.pctl->pgm[i]=0;
00073 }
00074
00075 return 0;
00076 }
00077
00078 int KMidSimpleAPI::kMidLoad(const char *filename)
00079 {
00080 if (kMidDevices()==0) return 0;
00081 return kMid.player->loadSong(filename);
00082 }
00083
00084 int KMidSimpleAPI::kMidPlay(int loop)
00085 {
00086 if (kMidDevices()==0) return 4;
00087 if (!kMid.player->isSongLoaded()) return 1;
00088 if (kMid.pctl->playing==1) return 2;
00089 if (kMid.midi->checkInit()==-1) return 3;
00090 kMid.pctl->message=0;
00091 kMid.pctl->playing=0;
00092 kMid.pctl->finished=0;
00093 kMid.pctl->error=0;
00094 kMid.pctl->SPEVplayed=0;
00095 kMid.pctl->SPEVprocessed=0;
00096 kMid.pctl->millisecsPlayed=0;
00097 if ((kMid.pid=fork())==0)
00098 {
00099 if (loop)
00100 {
00101 while (1)
00102 {
00103 kMid.player->play();
00104 if (kMid.pctl->error) return 5;
00105 kMid.pctl->message=0;
00106 kMid.pctl->playing=0;
00107 kMid.pctl->finished=0;
00108 kMid.pctl->error=0;
00109 kMid.pctl->SPEVplayed=0;
00110 kMid.pctl->SPEVprocessed=0;
00111 kMid.pctl->millisecsPlayed=0;
00112 }
00113
00114 } else {
00115 kMid.player->play();
00116 if (kMid.pctl->error) return 5;
00117 }
00118 _exit(0);
00119 } else return 4;
00120 return 0;
00121 }
00122
00123 int KMidSimpleAPI::kMidStop(void)
00124 {
00125 if (kMidDevices()==0) return 4;
00126 if (kMid.pctl->playing==0) return 1;
00127 if (kMid.pid!=0)
00128 {
00129 kill(kMid.pid,SIGTERM);
00130 waitpid(kMid.pid, NULL, 0);
00131 kMid.pid=0;
00132 } else return 2;
00133
00134 kMid.pctl->playing=0;
00135 return 0;
00136 }
00137
00138 void KMidSimpleAPI::kMidDestruct(void)
00139 {
00140 delete kMid.midi;
00141 kMid.midi=0L;
00142 delete kMid.player;
00143 kMid.player=0L;
00144 delete kMid.map;
00145 shmdt((char *)kMid.pctl);
00146 shmctl(kMid.pctlsmID, IPC_RMID, 0L);
00147 }
00148
00149 int KMidSimpleAPI::kMidIsPlaying(void)
00150 {
00151 return kMid.pctl->playing;
00152 }
00153
00154 int KMidSimpleAPI::kMidDevices(void)
00155 {
00156 return kMid.midi->midiPorts()+kMid.midi->synthDevices();
00157 }
00158
00159 const char * KMidSimpleAPI::kMidName(int i)
00160 {
00161 return kMid.midi->name(i);
00162 }
00163
00164 const char * KMidSimpleAPI::kMidType(int i)
00165 {
00166 return kMid.midi->type(i);
00167 }
00168
00169 void KMidSimpleAPI::kMidSetDevice(int i)
00170 {
00171 kMid.midi->setDefaultDevice(i);
00172 }
00173
00174 void KMidSimpleAPI::kMidSetMidiMapper(const char *mapfilename)
00175 {
00176 if (kMidDevices()==0) return;
00177 kMid.map=new MidiMapper(mapfilename);
00178 if ((kMid.map->ok() == 0L)||(!kMid.map->ok())) return;
00179 kMid.midi->setMidiMap(kMid.map);
00180 }
00181
00182 const char *KMidSimpleAPI::kMidVersion(void)
00183 {
00184 return "0.9.5";
00185 }
00186
00187 const char *KMidSimpleAPI::kMidCopyright(void)
00188 {
00189 return "LibKMid 0.9.5 (C)1997-2000 Antonio Larrosa Jimenez <larrosa@kde.org>.Malaga(es)";
00190 }
00191
00192
00193
00194
00195
00196
00197
00198
00199 int kMidInit(void)
00200 {
00201 return KMidSimpleAPI::kMidInit();
00202 }
00203
00204 int kMidLoad(const char *filename)
00205 {
00206 return KMidSimpleAPI::kMidLoad(filename);
00207 }
00208
00209 int kMidPlay(void)
00210 {
00211 return KMidSimpleAPI::kMidPlay();
00212 }
00213
00214 int kMidStop(void)
00215 {
00216 return KMidSimpleAPI::kMidStop();
00217 }
00218
00219 void kMidDestruct(void)
00220 {
00221 KMidSimpleAPI::kMidDestruct();
00222 }
00223
00224 int kMidIsPlaying(void)
00225 {
00226 return KMidSimpleAPI::kMidIsPlaying();
00227 }
00228
00229 int kMidDevices(void)
00230 {
00231 return KMidSimpleAPI::kMidDevices();
00232 }
00233
00234 const char *kMidName(int i)
00235 {
00236 return KMidSimpleAPI::kMidName(i);
00237 }
00238
00239 const char *kMidType(int i)
00240 {
00241 return KMidSimpleAPI::kMidType(i);
00242 }
00243
00244 void kMidSetDevice(int i)
00245 {
00246 KMidSimpleAPI::kMidSetDevice(i);
00247 }
00248
00249 void kMidSetMidiMapper(const char *mapfilename)
00250 {
00251 KMidSimpleAPI::kMidSetMidiMapper(mapfilename);
00252 }
00253
00254 const char *kMidVersion(void)
00255 {
00256 return KMidSimpleAPI::kMidVersion();
00257 }
00258
00259 const char *kMidCopyright(void)
00260 {
00261 return KMidSimpleAPI::kMidCopyright();
00262 }
00263
|