summaryrefslogtreecommitdiff
path: root/muse/muse/driver/jackaudio.h
blob: 76753eece559057fe1ce7424995dab5999de5393 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//=========================================================
//  MusE
//  Linux Music Editor
//    $Id: jackaudio.h,v 1.20.2.4 2009/12/20 05:00:35 terminator356 Exp $
//  (C) Copyright 2002 Werner Schweer (ws@seh.de)
//=========================================================

#ifndef __JACKAUDIO_H__
#define __JACKAUDIO_H__

#include <jack/jack.h>
#include "audiodev.h"

class MidiPlayEvent;

//---------------------------------------------------------
//   JackAudioDevice
//---------------------------------------------------------
bool checkAudioDevice();

class JackAudioDevice : public AudioDevice {

      jack_client_t* _client;
      double sampleTime;
      int samplePos;
      jack_transport_state_t transportState;
      jack_position_t pos;
      char jackRegisteredName[8];
      int dummyState;
      int dummyPos;
      // Free-running frame counter incremented always in process.
      jack_nframes_t _frameCounter; 
      
      static int processAudio(jack_nframes_t frames, void*);

   public:
      JackAudioDevice(jack_client_t* cl, char * jack_id_string);
      virtual ~JackAudioDevice();
      virtual void nullify_client() { _client = 0; }
      
      //virtual void start();
      virtual void start(int);
      virtual void stop ();
      virtual bool dummySync(int state); // Artificial sync when not using Jack transport.
      
      virtual int framePos() const;
      virtual unsigned frameTime() const     { return _frameCounter; }  

      virtual float* getBuffer(void* port, unsigned long nframes) {
            return (float*)jack_port_get_buffer((jack_port_t*)port, nframes);
            }

      virtual std::list<QString> outputPorts();
      virtual std::list<QString> inputPorts();

      virtual void registerClient();

      virtual void* registerOutPort(const char* name);
      virtual void* registerInPort(const char* name);

      virtual char* getJackName();

      virtual void unregisterPort(void*);
      virtual void connect(void*, void*);
      virtual void disconnect(void*, void*);
      virtual void setPortName(void* p, const char* n) { jack_port_set_name((jack_port_t*)p, n); }
      virtual void* findPort(const char* name);
      virtual QString portName(void* port);
      virtual int getState();
      virtual unsigned int getCurFrame();
      virtual bool isRealtime()          { return jack_is_realtime(_client); }
      virtual int realtimePriority() const;
      virtual void startTransport();
      virtual void stopTransport();
      virtual void seekTransport(unsigned frame);
      virtual void seekTransport(const Pos &p);
      virtual void setFreewheel(bool f);
      jack_transport_state_t transportQuery(jack_position_t* pos);
      void graphChanged();
      virtual int setMaster(bool f);

      // Port is not midi port, it is the port(s) created for MusE.
      virtual bool putEvent(int port, const MidiPlayEvent&);
      
      //static bool jackStarted;
      };

#endif