summaryrefslogtreecommitdiff
path: root/attic/muse2-oom/muse2/muse/driver/dummyaudio.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse2-oom/muse2/muse/driver/dummyaudio.cpp')
-rw-r--r--attic/muse2-oom/muse2/muse/driver/dummyaudio.cpp453
1 files changed, 0 insertions, 453 deletions
diff --git a/attic/muse2-oom/muse2/muse/driver/dummyaudio.cpp b/attic/muse2-oom/muse2/muse/driver/dummyaudio.cpp
deleted file mode 100644
index f4a00b4e..00000000
--- a/attic/muse2-oom/muse2/muse/driver/dummyaudio.cpp
+++ /dev/null
@@ -1,453 +0,0 @@
-//=========================================================
-// MusE
-// Linux Music Editor
-// $Id: dummyaudio.cpp,v 1.3.2.16 2009/12/20 05:00:35 terminator356 Exp $
-// (C) Copyright 2002-2003 Werner Schweer (ws@seh.de)
-//=========================================================
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <pthread.h>
-#include <sys/poll.h>
-
-#include "config.h"
-#include "audio.h"
-#include "audiodev.h"
-#include "globals.h"
-#include "song.h"
-#include "driver/alsatimer.h"
-#include "pos.h"
-#include "gconfig.h"
-#include "utils.h"
-
-class MidiPlayEvent;
-
-#define DEBUG_DUMMY 0
-//---------------------------------------------------------
-// DummyAudioDevice
-//---------------------------------------------------------
-
-//static const unsigned dummyFrames = 1024;
-
-enum Cmd {
-trSeek,
-trStart,
-trStop
-};
-
-struct Msg {
- enum Cmd cmd;
- int arg;
-};
-
-
-class DummyAudioDevice : public AudioDevice {
- pthread_t dummyThread;
- // Changed by Tim. p3.3.15
- //float buffer[1024];
- float* buffer;
- int _realTimePriority;
-
- public:
- std::list<Msg> cmdQueue;
- Audio::State state;
- int _framePos;
- int playPos;
- bool realtimeFlag;
-
- DummyAudioDevice();
- virtual ~DummyAudioDevice()
- {
- // Added by Tim. p3.3.15
- free(buffer);
- }
-
- virtual inline int deviceType() { return DUMMY_AUDIO; } // p3.3.52
-
- //virtual void start();
- virtual void start(int);
-
- virtual void stop ();
- virtual int framePos() const {
- if(DEBUG_DUMMY)
- printf("DummyAudioDevice::framePos %d\n", _framePos);
- return _framePos;
- }
-
- virtual float* getBuffer(void* /*port*/, unsigned long nframes)
- {
- // p3.3.30
- //if (nframes > dummyFrames) {
- //printf("error: segment size > 1024\n");
- if (nframes > segmentSize) {
- printf("DummyAudioDevice::getBuffer nframes > segment size\n");
-
- exit(-1);
- }
- return buffer;
- }
-
- virtual std::list<QString> outputPorts(bool midi = false, int aliases = -1);
- virtual std::list<QString> inputPorts(bool midi = false, int aliases = -1);
-
- virtual void registerClient() {}
-
- virtual const char* clientName() { return "MusE"; }
-
- //virtual void* registerOutPort(const char*) {
- virtual void* registerOutPort(const char*, bool) {
- return (void*)1;
- }
- //virtual void* registerInPort(const char*) {
- virtual void* registerInPort(const char*, bool) {
- return (void*)2;
- }
- virtual void unregisterPort(void*) {}
- virtual void connect(void*, void*) {}
- virtual void disconnect(void*, void*) {}
- virtual int connections(void* /*clientPort*/) { return 0; }
- virtual void setPortName(void*, const char*) {}
- virtual void* findPort(const char*) { return 0;}
- virtual QString portName(void*) {
- return QString("mops");
- }
- virtual int getState() {
-// if(DEBUG_DUMMY)
-// printf("DummyAudioDevice::getState %d\n", state);
-
- return state; }
- virtual unsigned getCurFrame() {
- if(DEBUG_DUMMY)
- printf("DummyAudioDevice::getCurFrame %d\n", _framePos);
-
- return _framePos; }
- virtual unsigned frameTime() const {
- return lrint(curTime() * sampleRate);
- }
- virtual bool isRealtime() { return realtimeFlag; }
- //virtual int realtimePriority() const { return 40; }
- virtual int realtimePriority() const { return _realTimePriority; }
- virtual void startTransport() {
- if(DEBUG_DUMMY)
- printf("DummyAudioDevice::startTransport playPos=%d\n", playPos);
- Msg trcmd;
- trcmd.cmd = trStart;
- trcmd.arg = playPos;
- cmdQueue.push_front(trcmd);
-/* state = Audio::START_PLAY;
- audio->sync(state, playPos);
- state = Audio::PLAY;*/
- }
- virtual void stopTransport() {
- if(DEBUG_DUMMY)
- printf("DummyAudioDevice::stopTransport, playPos=%d\n", playPos);
- state = Audio::STOP;
- }
- virtual int setMaster(bool) { return 1; }
-
- virtual void seekTransport(const Pos &p)
- {
- if(DEBUG_DUMMY)
- printf("DummyAudioDevice::seekTransport frame=%d topos=%d\n",playPos, p.frame());
- Msg trcmd;
- trcmd.cmd = trSeek;
- trcmd.arg = p.frame();
- cmdQueue.push_front(trcmd);
- playPos = p.frame();
- }
- virtual void seekTransport(unsigned pos) {
- if(DEBUG_DUMMY)
- printf("DummyAudioDevice::seekTransport frame=%d topos=%d\n",playPos,pos);
- Msg trcmd;
- trcmd.cmd = trSeek;
- trcmd.arg = pos;
- cmdQueue.push_front(trcmd);
- playPos = pos;
-/*
- Audio::State tempState = state;
- state = Audio::START_PLAY;
- audio->sync(state, playPos);
- state = tempState;*/
- }
- virtual void setFreewheel(bool) {}
- void setRealTime() { realtimeFlag = true; }
- };
-
-DummyAudioDevice* dummyAudio = 0;
-
-DummyAudioDevice::DummyAudioDevice()
- {
- // Added by Tim. p3.3.15
- // p3.3.30
- //posix_memalign((void**)&buffer, 16, sizeof(float) * dummyFrames);
- posix_memalign((void**)&buffer, 16, sizeof(float) * config.dummyAudioBufSize);
-
- realtimeFlag = false;
- state = Audio::STOP;
- _framePos = 0;
- playPos = 0;
- cmdQueue.clear();
- }
-
-//---------------------------------------------------------
-// exitDummyAudio
-//---------------------------------------------------------
-
-void exitDummyAudio()
-{
- if(dummyAudio)
- delete dummyAudio;
- dummyAudio = NULL;
- audioDevice = NULL;
-}
-
-//---------------------------------------------------------
-// initDummyAudio
-//---------------------------------------------------------
-
-bool initDummyAudio()
- {
- dummyAudio = new DummyAudioDevice();
- audioDevice = dummyAudio;
- return false;
- }
-
-//---------------------------------------------------------
-// outputPorts
-//---------------------------------------------------------
-
-std::list<QString> DummyAudioDevice::outputPorts(bool midi, int /*aliases*/)
- {
- std::list<QString> clientList;
- if(!midi)
- {
- clientList.push_back(QString("output1"));
- clientList.push_back(QString("output2"));
- }
- return clientList;
- }
-
-//---------------------------------------------------------
-// inputPorts
-//---------------------------------------------------------
-
-std::list<QString> DummyAudioDevice::inputPorts(bool midi, int /*aliases*/)
- {
- std::list<QString> clientList;
- if(!midi)
- {
- clientList.push_back(QString("input1"));
- clientList.push_back(QString("input2"));
- }
- return clientList;
- }
-
-//---------------------------------------------------------
-// dummyLoop
-//---------------------------------------------------------
-
-static void* dummyLoop(void* ptr)
- {
- //unsigned int tickRate = 25;
-
- // p3.3.30
- //sampleRate = 25600;
- sampleRate = config.dummyAudioSampleRate;
- //segmentSize = dummyFrames;
- segmentSize = config.dummyAudioBufSize;
- //unsigned int tickRate = sampleRate / dummyFrames;
- unsigned int tickRate = sampleRate / segmentSize;
-
- AlsaTimer timer;
- fprintf(stderr, "Get alsa timer for dummy driver:\n");
- timer.setFindBestTimer(false);
- int fd = timer.initTimer();
- if (fd==-1) {
- // QMessageBox::critical( 0, /*tr*/(QString("Failed to start timer for dummy audio driver!")),
- // /*tr*/(QString("No functional timer was available.\n"
- // "Alsa timer not available, check if module snd_timer is available and /dev/snd/timer is available")));
- fprintf(stderr, "Failed to start timer for dummy audio driver! No functional timer was available.\n"
- "Alsa timer not available, check if module snd_timer is available and /dev/snd/timer is available\n");
- pthread_exit(0);
- }
-
- /* Depending on nature of the timer, the requested tickRate might not
- * be available. The return value is the nearest available frequency,
- * so use this to reset our dummpy sampleRate to keep everything
- * consistent.
- */
- tickRate = timer.setTimerFreq( /*250*/ tickRate );
-
- // p3.3.31
- // If it didn't work, get the actual rate.
- if(tickRate == 0)
- tickRate = timer.getTimerFreq();
-
- sampleRate = tickRate * segmentSize;
- timer.startTimer();
-
- DummyAudioDevice *drvPtr = (DummyAudioDevice *)ptr;
-
- pollfd myPollFd;
-
- myPollFd.fd = fd;
- myPollFd.events = POLLIN;
-
- /*
- doSetuid();
- struct sched_param rt_param;
- int rv;
- memset(&rt_param, 0, sizeof(sched_param));
- int type;
- rv = pthread_getschedparam(pthread_self(), &type, &rt_param);
- if (rv != 0)
- perror("get scheduler parameter");
- if (type != SCHED_FIFO) {
- fprintf(stderr, "Driver thread not running SCHED_FIFO, trying to set...\n");
-
- memset(&rt_param, 0, sizeof(sched_param));
- //rt_param.sched_priority = 1;
- rt_param.sched_priority = realtimePriority();
- rv = pthread_setschedparam(pthread_self(), SCHED_FIFO, &rt_param);
- if (rv != 0)
- perror("set realtime scheduler");
- memset(&rt_param, 0, sizeof(sched_param));
- rv = pthread_getschedparam(pthread_self(), &type, &rt_param);
- if (rv != 0)
- perror("get scheduler parameter");
- if (type == SCHED_FIFO) {
- drvPtr->setRealTime();
- fprintf(stderr, "Thread succesfully set to SCHED_FIFO\n");
- }
- else {
- fprintf(stderr, "Unable to set thread to SCHED_FIFO\n");
- }
- }
- undoSetuid();
- */
-
-#ifndef __APPLE__
- doSetuid();
- //if (realTimePriority) {
- if (realTimeScheduling) {
- //
- // check if we really got realtime priviledges
- //
- int policy;
- if ((policy = sched_getscheduler (0)) < 0) {
- printf("cannot get current client scheduler for audio dummy thread: %s!\n", strerror(errno));
- }
- else
- {
- if (policy != SCHED_FIFO)
- printf("audio dummy thread _NOT_ running SCHED_FIFO\n");
- else if (debugMsg) {
- struct sched_param rt_param;
- memset(&rt_param, 0, sizeof(sched_param));
- int type;
- int rv = pthread_getschedparam(pthread_self(), &type, &rt_param);
- if (rv == -1)
- perror("get scheduler parameter");
- printf("audio dummy thread running SCHED_FIFO priority %d\n",
- rt_param.sched_priority);
- }
- }
- }
- undoSetuid();
-#endif
-
- /* unsigned long tick = 0;*/ // prevent compiler warning: unused variable
- for (;;) {
- int _pollWait = 10; // ms
- unsigned long count = 0;
- while (count < 1 /*250/tickRate*/) // will loop until the next tick occurs
- {
- /*int n = */ poll(&myPollFd, 1 /* npfd */, _pollWait);
- count += timer.getTimerTicks();
- while (drvPtr->cmdQueue.size())
- {
- Msg &msg = drvPtr->cmdQueue.back();
- drvPtr->cmdQueue.pop_back();
- switch(msg.cmd) {
- case trSeek:
- {
- //printf("trSeek\n");
- drvPtr->playPos = msg.arg;
- Audio::State tempState = drvPtr->state;
- drvPtr->state = Audio::START_PLAY;
- audio->sync(drvPtr->state, msg.arg);
- drvPtr->state = tempState;
- }
- break;
- case trStart:
- {
- //printf("trStart\n");
- drvPtr->state = Audio::START_PLAY;
- audio->sync(drvPtr->state, msg.arg);
- drvPtr->state = Audio::PLAY;
- }
- break;
- case trStop:
- break;
- default:
- printf("dummyLoop: Unknown command!\n");
- }
- }
- }
- audio->process(segmentSize);
- int increment = segmentSize; // 1 //tickRate / sampleRate * segmentSize;
- drvPtr->_framePos+=increment;
- if (drvPtr->state == Audio::PLAY)
- {
- drvPtr->playPos+=increment;
- }
- }
- timer.stopTimer();
- pthread_exit(0);
- }
-
-//void DummyAudioDevice::start()
-void DummyAudioDevice::start(int priority)
- {
- //realTimePriority = priority;
- _realTimePriority = priority;
- pthread_attr_t* attributes = 0;
-
- //if (priority) {
- if (realTimeScheduling && priority > 0) {
- attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
- pthread_attr_init(attributes);
-
- if (pthread_attr_setschedpolicy(attributes, SCHED_FIFO)) {
- printf("cannot set FIFO scheduling class for RT thread\n");
- }
- if (pthread_attr_setscope (attributes, PTHREAD_SCOPE_SYSTEM)) {
- printf("Cannot set scheduling scope for RT thread\n");
- }
- struct sched_param rt_param;
- memset(&rt_param, 0, sizeof(rt_param));
- rt_param.sched_priority = priority;
- if (pthread_attr_setschedparam (attributes, &rt_param)) {
- printf("Cannot set scheduling priority %d for RT thread (%s)\n",
- priority, strerror(errno));
- }
- }
-
- //pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
- //pthread_attr_init(attributes);
- if (pthread_create(&dummyThread, attributes, ::dummyLoop, this))
- perror("creating thread failed:");
- if (priority)
- pthread_attr_destroy(attributes);
- }
-
-void DummyAudioDevice::stop ()
- {
- pthread_cancel(dummyThread);
- pthread_join(dummyThread, 0);
- dummyThread = 0;
- }
-