You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
5.6 KiB
264 lines
5.6 KiB
/**************************************************************************
|
|
|
|
libtdemid.cc - class KMidSimpleAPI that makes it easy to use libtdemid
|
|
and a C wrapper.
|
|
This file is part of LibKMid 0.9.5
|
|
Copyright (C) 2000 Antonio Larrosa Jimenez
|
|
LibKMid's homepage : http://www.arrakis.es/~rlarrosa/libtdemid.html
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
|
|
Send comments and bug fixes to Antonio Larrosa <larrosa@kde.org>
|
|
|
|
***************************************************************************/
|
|
|
|
#include "libtdemid.h"
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <signal.h>
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#include <sys/shm.h>
|
|
|
|
#include "deviceman.h"
|
|
#include "player.h"
|
|
#include "midimapper.h"
|
|
|
|
struct kMidData kMid;
|
|
|
|
int KMidSimpleAPI::kMidInit(void)
|
|
{
|
|
kMid.midi = new DeviceManager();
|
|
if ( kMid.midi == 0L ) return 1;
|
|
kMid.midi->initManager();
|
|
if (!kMid.midi->ok()) return 1;
|
|
|
|
kMid.pctlsmID=shmget(getpid(),sizeof(PlayerController),0600 | IPC_CREAT);
|
|
if (kMid.pctlsmID==-1) return 1;
|
|
kMid.pctl=(PlayerController *)shmat(kMid.pctlsmID,NULL,0);
|
|
if (kMid.pctl==NULL) return 1;
|
|
|
|
kMid.player=new MidiPlayer(kMid.midi,kMid.pctl);
|
|
if ( kMid.player == 0L )
|
|
{
|
|
delete kMid.midi;
|
|
return 1;
|
|
}
|
|
|
|
kMid.player->setParseSong(false);
|
|
|
|
kMid.pctl->message=0;
|
|
kMid.pctl->gm=1;
|
|
kMid.pctl->error=0;
|
|
kMid.pctl->ratioTempo=1.0;
|
|
kMid.pctl->tempo=500000;
|
|
kMid.pctl->volumepercentage=100;
|
|
for (int i=0;i<16;i++)
|
|
{
|
|
kMid.pctl->forcepgm[i]=0;
|
|
kMid.pctl->pgm[i]=0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int KMidSimpleAPI::kMidLoad(const char *filename)
|
|
{
|
|
if (kMidDevices()==0) return 0;
|
|
return kMid.player->loadSong(filename);
|
|
}
|
|
|
|
int KMidSimpleAPI::kMidPlay(int loop)
|
|
{
|
|
if (kMidDevices()==0) return 4;
|
|
if (!kMid.player->isSongLoaded()) return 1;
|
|
if (kMid.pctl->playing==1) return 2;
|
|
if (kMid.midi->checkInit()==-1) return 3;
|
|
kMid.pctl->message=0;
|
|
kMid.pctl->playing=0;
|
|
kMid.pctl->finished=0;
|
|
kMid.pctl->error=0;
|
|
kMid.pctl->SPEVplayed=0;
|
|
kMid.pctl->SPEVprocessed=0;
|
|
kMid.pctl->millisecsPlayed=0;
|
|
if ((kMid.pid=fork())==0)
|
|
{
|
|
if (loop)
|
|
{
|
|
while (1)
|
|
{
|
|
kMid.player->play();
|
|
if (kMid.pctl->error) return 5;
|
|
kMid.pctl->message=0;
|
|
kMid.pctl->playing=0;
|
|
kMid.pctl->finished=0;
|
|
kMid.pctl->error=0;
|
|
kMid.pctl->SPEVplayed=0;
|
|
kMid.pctl->SPEVprocessed=0;
|
|
kMid.pctl->millisecsPlayed=0;
|
|
}
|
|
|
|
} else {
|
|
kMid.player->play();
|
|
if (kMid.pctl->error) return 5;
|
|
}
|
|
_exit(0);
|
|
} else return 4;
|
|
return 0;
|
|
}
|
|
|
|
int KMidSimpleAPI::kMidStop(void)
|
|
{
|
|
if (kMidDevices()==0) return 4;
|
|
if (kMid.pctl->playing==0) return 1;
|
|
if (kMid.pid!=0)
|
|
{
|
|
kill(kMid.pid,SIGTERM);
|
|
waitpid(kMid.pid, NULL, 0);
|
|
kMid.pid=0;
|
|
} else return 2;
|
|
|
|
kMid.pctl->playing=0;
|
|
return 0;
|
|
}
|
|
|
|
void KMidSimpleAPI::kMidDestruct(void)
|
|
{
|
|
delete kMid.midi;
|
|
kMid.midi=0L;
|
|
delete kMid.player;
|
|
kMid.player=0L;
|
|
delete kMid.map;
|
|
shmdt((char *)kMid.pctl);
|
|
shmctl(kMid.pctlsmID, IPC_RMID, 0L);
|
|
}
|
|
|
|
int KMidSimpleAPI::kMidIsPlaying(void)
|
|
{
|
|
return kMid.pctl->playing;
|
|
}
|
|
|
|
int KMidSimpleAPI::kMidDevices(void)
|
|
{
|
|
return kMid.midi->midiPorts()+kMid.midi->synthDevices();
|
|
}
|
|
|
|
const char * KMidSimpleAPI::kMidName(int i)
|
|
{
|
|
return kMid.midi->name(i);
|
|
}
|
|
|
|
const char * KMidSimpleAPI::kMidType(int i)
|
|
{
|
|
return kMid.midi->type(i);
|
|
}
|
|
|
|
void KMidSimpleAPI::kMidSetDevice(int i)
|
|
{
|
|
kMid.midi->setDefaultDevice(i);
|
|
}
|
|
|
|
void KMidSimpleAPI::kMidSetMidiMapper(const char *mapfilename)
|
|
{
|
|
if (kMidDevices()==0) return;
|
|
kMid.map=new MidiMapper(mapfilename);
|
|
if ((kMid.map->ok() == 0L)||(!kMid.map->ok())) return;
|
|
kMid.midi->setMidiMap(kMid.map);
|
|
}
|
|
|
|
const char *KMidSimpleAPI::kMidVersion(void)
|
|
{
|
|
return "0.9.5";
|
|
}
|
|
|
|
const char *KMidSimpleAPI::kMidCopyright(void)
|
|
{
|
|
return "LibKMid 0.9.5 (C)1997-2000 Antonio Larrosa Jimenez <larrosa@kde.org>.Malaga(es)";
|
|
}
|
|
|
|
/* * * * * *
|
|
|
|
Under this line (------) there's only a C wrapper for the KMidSimpleAPI class
|
|
|
|
* * * * * */
|
|
|
|
|
|
int kMidInit(void)
|
|
{
|
|
return KMidSimpleAPI::kMidInit();
|
|
}
|
|
|
|
int kMidLoad(const char *filename)
|
|
{
|
|
return KMidSimpleAPI::kMidLoad(filename);
|
|
}
|
|
|
|
int kMidPlay(void)
|
|
{
|
|
return KMidSimpleAPI::kMidPlay();
|
|
}
|
|
|
|
int kMidStop(void)
|
|
{
|
|
return KMidSimpleAPI::kMidStop();
|
|
}
|
|
|
|
void kMidDestruct(void)
|
|
{
|
|
KMidSimpleAPI::kMidDestruct();
|
|
}
|
|
|
|
int kMidIsPlaying(void)
|
|
{
|
|
return KMidSimpleAPI::kMidIsPlaying();
|
|
}
|
|
|
|
int kMidDevices(void)
|
|
{
|
|
return KMidSimpleAPI::kMidDevices();
|
|
}
|
|
|
|
const char *kMidName(int i)
|
|
{
|
|
return KMidSimpleAPI::kMidName(i);
|
|
}
|
|
|
|
const char *kMidType(int i)
|
|
{
|
|
return KMidSimpleAPI::kMidType(i);
|
|
}
|
|
|
|
void kMidSetDevice(int i)
|
|
{
|
|
KMidSimpleAPI::kMidSetDevice(i);
|
|
}
|
|
|
|
void kMidSetMidiMapper(const char *mapfilename)
|
|
{
|
|
KMidSimpleAPI::kMidSetMidiMapper(mapfilename);
|
|
}
|
|
|
|
const char *kMidVersion(void)
|
|
{
|
|
return KMidSimpleAPI::kMidVersion();
|
|
}
|
|
|
|
const char *kMidCopyright(void)
|
|
{
|
|
return KMidSimpleAPI::kMidCopyright();
|
|
}
|
|
|