00001
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