1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
3 /*
4 Rosegarden
5 A MIDI and audio sequencer and musical notation editor.
6 Copyright 2000-2021 the Rosegarden development team.
7
8 This file is Copyright 2005
9 Toni Arnold <toni__arnold@bluewin.ch>
10
11 Other copyrights also apply to some parts of this work. Please
12 see the AUTHORS file and individual file headers for details.
13
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version. See the file
18 COPYING included with this distribution for more information.
19 */
20
21 #define RG_MODULE_STRING "[LircCommander]"
22
23 #include "LircCommander.h"
24 #include "LircClient.h"
25
26 #ifdef HAVE_LIRC
27
28 #include "misc/Debug.h"
29 #include "document/RosegardenDocument.h"
30 #include "gui/editors/segment/TrackButtons.h"
31 #include "RosegardenMainWindow.h"
32 #include "RosegardenMainViewWidget.h"
33 #include "document/CommandHistory.h"
34
35 #include <QObject>
36 #include <unistd.h>
37
38 namespace Rosegarden
39 {
40
LircCommander(LircClient * lirc,RosegardenMainWindow * rgGUIApp)41 LircCommander::LircCommander(LircClient *lirc, RosegardenMainWindow *rgGUIApp)
42 : QObject()
43 {
44 m_lirc = lirc;
45 m_rgGUIApp = rgGUIApp;
46 connect(m_lirc, &LircClient::buttonPressed,
47 this, &LircCommander::slotExecute );
48
49 connect(this, &LircCommander::play,
50 m_rgGUIApp, &RosegardenMainWindow::slotPlay );
51 connect(this, &LircCommander::stop,
52 m_rgGUIApp, &RosegardenMainWindow::slotStop );
53 connect(this, &LircCommander::record,
54 m_rgGUIApp, &RosegardenMainWindow::slotRecord );
55 connect(this, &LircCommander::rewind,
56 m_rgGUIApp, &RosegardenMainWindow::slotRewind );
57 connect(this, &LircCommander::rewindToBeginning,
58 m_rgGUIApp, &RosegardenMainWindow::slotRewindToBeginning );
59 connect(this, &LircCommander::fastForward,
60 m_rgGUIApp, &RosegardenMainWindow::slotFastforward );
61 connect(this, &LircCommander::fastForwardToEnd,
62 m_rgGUIApp, &RosegardenMainWindow::slotFastForwardToEnd );
63 connect(this, &LircCommander::toggleRecord,
64 m_rgGUIApp, &RosegardenMainWindow::slotToggleRecord );
65 connect(this, &LircCommander::trackDown,
66 m_rgGUIApp, &RosegardenMainWindow::slotSelectNextTrack);
67 connect(this, &LircCommander::trackUp,
68 m_rgGUIApp, &RosegardenMainWindow::slotSelectPreviousTrack);
69 connect(this, SIGNAL(trackMute()),
70 m_rgGUIApp, SLOT(slotToggleMute()) );
71 connect(this, &LircCommander::trackRecord,
72 m_rgGUIApp, &RosegardenMainWindow::slotToggleRecordCurrentTrack );
73 connect(this, &LircCommander::undo,
74 CommandHistory::getInstance(), &CommandHistory::undo );
75 connect(this, &LircCommander::redo,
76 CommandHistory::getInstance(), &CommandHistory::redo );
77 connect(this, &LircCommander::aboutrg,
78 m_rgGUIApp, &RosegardenMainWindow::slotHelpAbout );
79 connect(this, &LircCommander::editInMatrix,
80 m_rgGUIApp, &RosegardenMainWindow::slotEditInMatrix );
81 connect(this, &LircCommander::editInPercussionMatrix,
82 m_rgGUIApp, &RosegardenMainWindow::slotEditInPercussionMatrix );
83 connect(this, &LircCommander::editInEventList,
84 m_rgGUIApp, &RosegardenMainWindow::slotEditInEventList );
85 connect(this, &LircCommander::editAsNotation,
86 m_rgGUIApp, &RosegardenMainWindow::slotEditAsNotation );
87 connect(this, &LircCommander::quit,
88 m_rgGUIApp, &RosegardenMainWindow::slotQuit );
89 connect(this, &LircCommander::closeTransport,
90 m_rgGUIApp, &RosegardenMainWindow::slotCloseTransport );
91 connect(this, &LircCommander::toggleTransportVisibility,
92 m_rgGUIApp, &RosegardenMainWindow::slotToggleTransportVisibility );
93 }
94
95 LircCommander::command LircCommander::commands[] =
96 {
97 { "ABOUTRG", cmd_aboutrg },
98 { "CLOSETRANSPORT", cmd_closeTransport },
99 { "EDITEVLIST", cmd_editInEventList },
100 { "EDITMATRIX", cmd_editInMatrix },
101 { "EDITNOTATION", cmd_editAsNotation },
102 { "EDITPMATRIX", cmd_editInPercussionMatrix },
103 { "FORWARD", cmd_fastForward },
104 { "FORWARDTOEND", cmd_fastForwardToEnd },
105 { "PLAY", cmd_play },
106 { "PUNCHINRECORD", cmd_toggleRecord },
107 { "QUIT", cmd_quit },
108 { "RECORD", cmd_record },
109 { "REDO", cmd_redo },
110 { "REWIND", cmd_rewind },
111 { "REWINDTOBEGINNING", cmd_rewindToBeginning },
112 { "STOP", cmd_stop },
113 { "TOGGLETRANSPORT", cmd_toggleTransportVisibility },
114 { "TRACK+", cmd_trackUp },
115 { "TRACK-", cmd_trackDown },
116 { "TRACK-MUTE", cmd_trackMute },
117 { "TRACK-RECORD", cmd_trackRecord },
118 { "UNDO", cmd_undo },
119 };
120
121
compareCommandName(const void * c1,const void * c2)122 int LircCommander::compareCommandName(const void *c1, const void *c2)
123 {
124 return (strcmp(((struct command *)c1)->name, ((struct command *)c2)->name));
125 }
126
slotExecute(const char * command)127 void LircCommander::slotExecute(const char *command)
128 {
129 struct command tmp, *res;
130
131 RG_DEBUG << "LircCommander::slotExecute: invoking command: " << command;
132
133 // find the function for the name
134 tmp.name = command;
135 res = (struct command *)bsearch(&tmp, commands,
136 sizeof(commands) / sizeof(struct command),
137 sizeof(struct command),
138 compareCommandName);
139 if (res != nullptr)
140 {
141 switch (res->code)
142 {
143 case cmd_play:
144 emit play();
145 break;
146 case cmd_stop:
147 emit stop();
148 break;
149 case cmd_record:
150 emit record();
151 break;
152 case cmd_rewind:
153 emit rewind();
154 break;
155 case cmd_rewindToBeginning:
156 emit rewindToBeginning();
157 break;
158 case cmd_fastForward:
159 emit fastForward();
160 break;
161 case cmd_fastForwardToEnd:
162 emit fastForwardToEnd();
163 break;
164 case cmd_toggleRecord:
165 emit toggleRecord();
166 break;
167 case cmd_trackDown:
168 emit trackDown();
169 break;
170 case cmd_trackUp:
171 emit trackUp();
172 break;
173 case cmd_trackMute:
174 emit trackMute();
175 break;
176 case cmd_trackRecord:
177 emit trackRecord();
178 break;
179 case cmd_undo:
180 emit undo();
181 break;
182 case cmd_redo:
183 emit redo();
184 break;
185 case cmd_aboutrg:
186 emit aboutrg();
187 break;
188 case cmd_editInEventList:
189 emit editInEventList();
190 break;
191 case cmd_editInMatrix:
192 emit editInMatrix();
193 break;
194 case cmd_editInPercussionMatrix:
195 emit editInPercussionMatrix();
196 break;
197 case cmd_editAsNotation:
198 emit editAsNotation();
199 break;
200 case cmd_quit:
201 emit quit();
202 break;
203 case cmd_closeTransport:
204 emit closeTransport();
205 break;
206 case cmd_toggleTransportVisibility:
207 emit toggleTransportVisibility();
208 break;
209 default:
210 RG_DEBUG << "LircCommander::slotExecute: unhandled command " << command;
211 return;
212 }
213 RG_DEBUG << "LircCommander::slotExecute: handled command: " << command;
214 }
215 else
216 {
217 RG_DEBUG << "LircCommander::slotExecute: invoking command: " << command
218 << " failed (command not defined in LircCommander::commands[])";
219 };
220 }
221
222 }
223
224
225 #endif
226