LMMS
Loading...
Searching...
No Matches
AudioJack.h
Go to the documentation of this file.
1/*
2 * AudioJack.h - support for JACK-transport
3 *
4 * Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
5 *
6 * This file is part of LMMS - https://lmms.io
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program (see COPYING); if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 *
23 */
24
25#ifndef LMMS_AUDIO_JACK_H
26#define LMMS_AUDIO_JACK_H
27
28#include "lmmsconfig.h"
29
30#ifdef LMMS_HAVE_JACK
31#ifndef LMMS_HAVE_WEAKJACK
32#include <jack/jack.h>
33#else
34#include <weak_libjack.h>
35#endif
36
37#include <atomic>
38#include <vector>
39#ifdef AUDIO_BUS_HANDLE_SUPPORT
40#include <QMap>
41#endif
42
43#include "AudioDevice.h"
45#ifdef AUDIO_BUS_HANDLE_SUPPORT
46#include "AudioBusHandle.h"
47#endif
48
49class QLineEdit;
50class QMenu;
51class QToolButton;
52
53namespace lmms
54{
55
56class MidiJack;
57
58
59class AudioJack : public QObject, public AudioDevice
60{
61 Q_OBJECT
62public:
63 AudioJack(bool& successful, AudioEngine* audioEngine);
64 ~AudioJack() override;
65
66 // this is to allow the jack midi connection to use the same jack client connection
67 // the jack callback is handled here, we call the midi client so that it can read
68 // it's midi data during the callback
69 AudioJack* addMidiClient(MidiJack* midiClient);
70 void removeMidiClient() { m_midiClient = nullptr; }
72
73 inline static QString name()
74 {
75 return QT_TRANSLATE_NOOP("AudioDeviceSetupWidget", "JACK (JACK Audio Connection Kit)");
76 }
77
79 {
80 public:
81 setupWidget(QWidget* parent);
82 void saveSettings() override;
83
84 private:
85 std::vector<std::string> getAudioPortNames(JackPortFlags portFlags) const;
86 std::vector<std::string> getAudioInputNames() const;
87 std::vector<std::string> getAudioOutputNames() const;
88 static QMenu* buildMenu(QToolButton* toolButton, const std::vector<std::string>& names, const QString& filteredLMMSClientName);
89
90 private:
91 QLineEdit* m_clientName;
92 // Because we do not have access to a JackAudio driver instance we have to be our own client to display inputs and outputs...
94
95 std::vector<QToolButton*> m_outputDevices;
96 std::vector<QToolButton*> m_inputDevices;
97 };
98
99private slots:
101
102private:
103 bool initJackClient();
104 void resizeInputBuffer(jack_nframes_t nframes);
105
106 void attemptToConnect(size_t index, const char *lmms_port_type, const char *source_port, const char *destination_port);
107 void attemptToReconnectOutput(size_t outputIndex, const QString& targetPort);
108 void attemptToReconnectInput(size_t inputIndex, const QString& sourcePort);
109
110 void startProcessing() override;
111 void stopProcessing() override;
112
113 void registerPort(AudioBusHandle* port) override;
114 void unregisterPort(AudioBusHandle* port) override;
115 void renamePort(AudioBusHandle* port) override;
116
117 int processCallback(jack_nframes_t nframes);
118
119 static int staticProcessCallback(jack_nframes_t nframes, void* udata);
120 static void shutdownCallback(void* _udata);
121
123
125 std::atomic<bool> m_stopped;
126
127 std::atomic<MidiJack*> m_midiClient;
128 std::vector<jack_port_t*> m_outputPorts;
129 std::vector<jack_port_t*> m_inputPorts;
130 jack_default_audio_sample_t** m_tempOutBufs;
131 std::vector<SampleFrame> m_inputFrameBuffer;
133
136
137#ifdef AUDIO_BUS_HANDLE_SUPPORT
138 struct StereoPort
139 {
140 jack_port_t* ports[2];
141 };
142
143 using JackPortMap = QMap<AudioBusHandle*, StereoPort>;
144 JackPortMap m_portMap;
145#endif
146
147signals:
148 void zombified();
149};
150
151} // namespace lmms
152
153#endif // LMMS_HAVE_JACK
154
155#endif // LMMS_AUDIO_JACK_H
Job between PlayHandle and MixerChannel.
Definition AudioBusHandle.h:55
AudioEngine * audioEngine()
Definition AudioDevice.h:121
AudioDevice(const ch_cnt_t _channels, AudioEngine *audioEngine)
Definition AudioDevice.cpp:33
Definition AudioEngine.h:66
std::vector< std::string > getAudioOutputNames() const
Definition AudioJack.cpp:609
std::vector< QToolButton * > m_outputDevices
Definition AudioJack.h:95
setupWidget(QWidget *parent)
Definition AudioJack.cpp:495
void saveSettings() override
Definition AudioJack.cpp:567
static QMenu * buildMenu(QToolButton *toolButton, const std::vector< std::string > &names, const QString &filteredLMMSClientName)
Definition AudioJack.cpp:619
std::vector< std::string > getAudioPortNames(JackPortFlags portFlags) const
Definition AudioJack.cpp:582
jack_client_t * m_client
Definition AudioJack.h:93
std::vector< QToolButton * > m_inputDevices
Definition AudioJack.h:96
QLineEdit * m_clientName
Definition AudioJack.h:91
std::vector< std::string > getAudioInputNames() const
Definition AudioJack.cpp:614
void renamePort(AudioBusHandle *port) override
Definition AudioJack.cpp:371
std::vector< jack_port_t * > m_outputPorts
Definition AudioJack.h:128
std::atomic< MidiJack * > m_midiClient
Definition AudioJack.h:127
bool m_active
Definition AudioJack.h:124
int processCallback(jack_nframes_t nframes)
Definition AudioJack.cpp:394
void attemptToReconnectOutput(size_t outputIndex, const QString &targetPort)
Definition AudioJack.cpp:259
jack_default_audio_sample_t ** m_tempOutBufs
Definition AudioJack.h:130
~AudioJack() override
Definition AudioJack.cpp:119
jack_client_t * jackClient()
Definition AudioJack.h:71
SampleFrame * m_outBuf
Definition AudioJack.h:132
void unregisterPort(AudioBusHandle *port) override
Definition AudioJack.cpp:355
void restartAfterZombified()
Definition AudioJack.cpp:143
std::vector< SampleFrame > m_inputFrameBuffer
Definition AudioJack.h:131
void registerPort(AudioBusHandle *port) override
Definition AudioJack.cpp:335
void resizeInputBuffer(jack_nframes_t nframes)
Definition AudioJack.cpp:241
f_cnt_t m_framesToDoInCurBuf
Definition AudioJack.h:135
void startProcessing() override
Definition AudioJack.cpp:292
AudioJack(bool &successful, AudioEngine *audioEngine)
Definition AudioJack.cpp:94
std::atomic< bool > m_stopped
Definition AudioJack.h:125
static QString name()
Definition AudioJack.h:73
f_cnt_t m_framesDoneInCurBuf
Definition AudioJack.h:134
static void shutdownCallback(void *_udata)
Definition AudioJack.cpp:485
void removeMidiClient()
Definition AudioJack.h:70
void attemptToReconnectInput(size_t inputIndex, const QString &sourcePort)
Definition AudioJack.cpp:275
jack_client_t * m_client
Definition AudioJack.h:122
AudioJack * addMidiClient(MidiJack *midiClient)
Definition AudioJack.cpp:169
static int staticProcessCallback(jack_nframes_t nframes, void *udata)
Definition AudioJack.cpp:477
void stopProcessing() override
Definition AudioJack.cpp:330
std::vector< jack_port_t * > m_inputPorts
Definition AudioJack.h:129
void attemptToConnect(size_t index, const char *lmms_port_type, const char *source_port, const char *destination_port)
Definition AudioJack.cpp:246
bool initJackClient()
Definition AudioJack.cpp:179
Definition MidiJack.h:51
Definition SampleFrame.h:41
Definition AudioDeviceSetupWidget.h:35
static uintptr_t parent
Definition pugl.h:1644
struct _jack_client jack_client_t
Definition jack-enum-test-func.cpp:69
uint32_t jack_nframes_t
Definition jack-enum-test-func.cpp:38
Definition AudioAlsa.cpp:35
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43