summaryrefslogtreecommitdiff
path: root/muse2/muse/driver/jackaudio.h
blob: d3132efe530a9ee0e4d61c10e3aac85c2d0c4dd4 (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
90
91
92
93
94
95
96
97
//=========================================================
//  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[16];
      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 inline int deviceType() { return JACK_AUDIO; }   // p3.3.52
      
      void scanMidiPorts();
      
      //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(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 jackRegisteredName; }

      //virtual void* registerOutPort(const char* name);
      //virtual void* registerInPort(const char* name);
      virtual void* registerOutPort(const char* /*name*/, bool /*midi*/);
      virtual void* registerInPort(const char* /*name*/, bool /*midi*/);

      //virtual char* getJackName();

      virtual void unregisterPort(void*);
      virtual void connect(void*, void*);
      virtual void disconnect(void*, void*);
      virtual int connections(void* clientPort) { return jack_port_connected((jack_port_t*)clientPort); }
      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();
      void registrationChanged();
      void connectJackMidiPorts();
      
      virtual int setMaster(bool f);

      //static bool jackStarted;
      };

#endif