LiVES  3.0.2
liblives.hpp
Go to the documentation of this file.
1 // liblives.hpp
2 // LiVES (lives-exe)
3 // (c) G. Finch <salsaman+lives@gmail.com> 2015 - 2018
4 // Released under the GPL 3 or later
5 // see file ../COPYING for licensing details
6 
11 #ifndef HAS_LIBLIVES_H
12 #define HAS_LIBLIVES_H
13 
17 #define LIVES_VERSION_MAJOR 3
18 
22 #define LIVES_VERSION_MINOR 0
23 
27 #define LIVES_VERSION_MICRO 2
28 
32 #define LIVES_CHECK_VERSION(major, minor, micro) (major > LIVES_VERSION_MAJOR || (major == LIVES_VERSION_MAJOR && (minor > LIVES_VERSION_MINOR || (minor == LIVES_VERSION_MINOR && micro >= LIVES_VERSION_MICRO))))
33 
34 
35 // defs shared with lbindings.c
36 
40 typedef enum {
43  // LIVES_FILE_CHOOSER_VIDEO_AUDIO_MULTI, ///< file chooser options for multiple video or audio files
44  //LIVES_FILE_CHOOSER_VIDEO_RANGE ///< file chooser options for video range (start time/number of frames)
46 
50 typedef enum {
55 
56 
60 typedef enum {
68 
69 
73 typedef enum {
77 
78 
82 typedef enum {
89 
92 
94 
97 
98 
101 
103 
105 
106 #ifndef DOXYGEN_SKIP
108 #endif
110 
111 
112 
116 typedef enum {
120  //LIVES_CHAR_ENCODING_UTF16, ///< UTF-16 char encoding
122 
126 #define LIVES_CHAR_ENCODING_DEFAULT LIVES_CHAR_ENCODING_UTF8
127 
131 typedef enum {
132  // positive values for custom responses
145 
146 
150 typedef enum {
155 
156 
160 typedef enum {
168 
169 
170 
174 typedef enum {
177 
178 
179 
183 typedef enum {
188 
189 
190 
194 typedef enum {
199 
200 
202 
203 #ifdef __cplusplus
204 
205 #include <vector>
206 #include <list>
207 #include <map>
208 
209 #include <inttypes.h>
210 
211 #include <string>
212 
216 typedef unsigned long ulong;
217 
218 
219 #ifndef DOXYGEN_SKIP
220 extern "C" {
221 void binding_cb(lives_callback_t cb_type, const char *msgstring, uint64_t id);
222 }
223 #endif
224 
225 using namespace std;
226 
228 
229 
230 
231 
232 
236 namespace lives {
237 
239 
243 typedef class livesApp livesApp;
244 
248 typedef class set set;
249 
253 typedef class clip clip;
254 
258 typedef class effectKey effectKey;
259 
263 typedef class effectKeyMap effectKeyMap;
264 
268 typedef class effect effect;
269 
270 
274 typedef class player player;
275 
276 
280 typedef class multitrack multitrack;
281 
282 
286 typedef class block block;
287 
288 
292 typedef class livesString livesString;
293 
294 
298 typedef list<livesString> livesStringList;
299 
300 
302 
303 
308 class livesString : public std::string {
309 public:
310  livesString(const string &str = "", lives_char_encoding_t e = LIVES_CHAR_ENCODING_DEFAULT) : std::string(str), m_encoding(e) {}
311  livesString(const string &str, size_t pos, size_t len = npos, lives_char_encoding_t e = LIVES_CHAR_ENCODING_DEFAULT) : std::string(str, pos,
312  len), m_encoding(e) {}
313  livesString(const char *s, lives_char_encoding_t e = LIVES_CHAR_ENCODING_DEFAULT) : std::string(s), m_encoding(e) {}
314  livesString(const char *s, size_t n, lives_char_encoding_t e = LIVES_CHAR_ENCODING_DEFAULT) : std::string(s, n), m_encoding(e) {}
315  livesString(size_t n, char c, lives_char_encoding_t e = LIVES_CHAR_ENCODING_DEFAULT) : std::string(n, c), m_encoding(e) {}
316  template <class InputIterator>
317  livesString(InputIterator first, InputIterator last,
318  lives_char_encoding_t e = LIVES_CHAR_ENCODING_DEFAULT) : std::string(first, last), m_encoding(e) {}
319 
325  livesString toEncoding(lives_char_encoding_t enc);
326 
331  void setEncoding(lives_char_encoding_t enc);
332 
337  lives_char_encoding_t encoding();
338 
339 private:
340  lives_char_encoding_t m_encoding;
341 };
342 
343 #ifndef DOXYGEN_SKIP
344 typedef void *(*callback_f)(void *);
345 
346 typedef struct {
347  ulong id;
348  livesApp *object;
349  lives_callback_t cb_type;
350  callback_f func;
351  void *data;
352 } closure;
353 
354 typedef list<closure *> closureList;
355 typedef list<closure *>::iterator closureListIterator;
356 #endif
357 
361 typedef struct {
363 } modeChangedInfo;
364 
365 
369 typedef struct {
370  int signum;
371 } appQuitInfo;
372 
373 
374 #ifndef DOXYGEN_SKIP
375 typedef struct {
376  ulong id;
377  char *response;
378 } _privateInfo;
379 
380 
381 typedef bool (*private_callback_f)(_privateInfo *, void *);
382 #endif
383 
389 typedef bool (*modeChanged_callback_f)(livesApp *, modeChangedInfo *, void *);
390 
396 typedef bool (*appQuit_callback_f)(livesApp *, appQuitInfo *, void *);
397 
398 
404 typedef bool (*objectDestroyed_callback_f)(livesApp *, void *);
405 
406 
407 
413 class livesApp {
414  friend set;
415  friend clip;
416  friend effectKeyMap;
417  friend effectKey;
418  friend player;
419  friend multitrack;
420  friend block;
421 
422 public:
426  livesApp();
427 
434  livesApp(int argc, char *argv[]);
435 
440  ~livesApp();
441 
447  bool isValid() const;
448 
453  bool isReady() const;
454 
460  bool isPlaying() const;
461 
465  const set &getSet();
466 
470  const effectKeyMap &getEffectKeyMap();
471 
475  const player &getPlayer();
476 
480  const multitrack &getMultitrack();
481 
487  bool removeCallback(ulong id) const;
488 
498  ulong addCallback(lives_callback_t cb_type, modeChanged_callback_f func, void *data) const;
499 
509  ulong addCallback(lives_callback_t cb_type, appQuit_callback_f func, void *data) const;
510 
520  ulong addCallback(lives_callback_t cb_type, objectDestroyed_callback_f func, void *data) const;
521 
529  lives_dialog_response_t showInfo(livesString text, bool blocking = true);
530 
544  livesString chooseFileWithPreview(livesString dirname, lives_filechooser_t chooser_type, livesString title = livesString(""));
545 
560  clip openFile(livesString fname, bool with_audio = true, double stime = 0., int frames = 0, bool deinterlace = false);
561 
570  livesStringList availableSets();
571 
582  livesString chooseSet();
583 
594  bool reloadSet(livesString setname);
595 
603  bool setInteractive(bool setting);
604 
610  bool interactive();
611 
618  bool deinterlaceOption();
619 
626  lives_interface_mode_t mode();
627 
636  lives_interface_mode_t setMode(lives_interface_mode_t mode);//, livesMultitrackSettings settings=NULL);
637 
644  lives_status_t status() const;
645 
650  bool cancel();
651 
652 
653 
654 #ifndef DOXYGEN_SKIP
655  // For internal use only.
656  closureList &closures();
657  void invalidate();
658  void setClosures(closureList cl);
659 
660  bool setPref(const char *prefidx, bool val) const;
661  bool setPref(const char *prefidx, int val) const;
662  bool setPref(const char *prefidx, int bitfield, bool val) const;
663 
664 #endif
665 
666 protected:
667  ulong addCallback(lives_callback_t cb_type, private_callback_f func, void *data) const;
668 
669 private:
670  ulong m_id;
671  closureList m_closures;
672  set *m_set;
673  player *m_player;
674  effectKeyMap *m_effectKeyMap;
675  multitrack *m_multitrack;
676 
677  pthread_t *m_thread;
678 
679  bool m_deinterlace;
680 
681  ulong appendClosure(lives_callback_t cb_type, callback_f func, void *data) const;
682  void init(int argc, char *argv[]);
683 
684  void operator=(livesApp const &); // Don't implement
685  livesApp(const livesApp &other); // Don't implement
686 
687 };
688 
689 
690 
691 
700 class clip {
701  friend livesApp;
702  friend set;
703  friend block;
704  friend multitrack;
705  friend player;
706 
707 public:
708 
712  clip();
713 
720  bool isValid() const;
721 
728  int frames();
729 
736  int width();
737 
744  int height();
745 
752  double FPS();
753 
763  double playbackFPS();
764 
770  livesString name();
771 
780  int audioRate();
781 
791  int playbackAudioRate();
792 
799  int audioChannels();
800 
807  int audioSampleSize();
808 
814  bool audioSigned();
815 
821  lives_endian_t audioEndian();
822 
823 
829  double audioLength();
830 
837  int selectionStart();
838 
845  int selectionEnd();
846 
847 
853  bool selectAll();
854 
862  bool setSelectionStart(unsigned int start);
863 
871  bool setSelectionEnd(unsigned int end);
872 
881  bool switchTo();
882 
890  bool setIsBackground();
891 
895  inline bool operator==(const clip &other) {
896  return other.m_uid == m_uid && m_lives == other.m_lives;
897  }
898 
899 protected:
900  clip(ulong uid, livesApp *lives = NULL);
901  ulong m_uid;
902 
903 private:
904  livesApp *m_lives;
905 
906 };
907 
908 
909 
910 #ifndef DOXYGEN_SKIP
911 typedef vector<ulong> clipList;
912 typedef vector<ulong>::iterator clipListIterator;
913 #endif
914 
916 
917 
923 class set {
924  friend livesApp;
925 
926 public:
927 
933  bool isValid() const;
934 
940  livesString name() const;
941 
952  bool setName(livesString name = livesString()) const;
953 
965  bool save(livesString name, bool force_append = false) const;
966 
972  bool save() const;
973 
980  unsigned int numClips() const;
981 
988  clip nthClip(unsigned int n) const;
989 
997  int indexOf(clip c) const;
998 
1004  livesStringList layoutNames(unsigned int n) const;
1005 
1009  inline bool operator==(const set &other) const {
1010  return other.m_lives == m_lives;
1011  }
1012 
1013 
1014 protected:
1015  set(livesApp *lives = NULL);
1016 
1017 private:
1018  livesApp *m_lives;
1019  clipList m_clips;
1020 
1021  void update_clip_list(void);
1022 
1023 
1024 };
1025 
1026 
1027 
1028 
1029 
1035 class player {
1036  friend livesApp;
1037 
1038 public:
1039 
1045  bool isValid() const;
1046 
1050  bool isPlaying() const;
1051 
1052 
1056  bool isRecording() const;
1057 
1066  void setSepWin(bool setting) const;
1067 
1072  bool sepWin() const;
1073 
1080  void setFullScreen(bool setting) const;
1081 
1086  bool fullScreen() const;
1087 
1096  void setFS(bool setting) const;
1097 
1103  bool play() const;
1104 
1110  bool stop() const;
1111 
1121  bool setForegroundClip(clip c) const;
1122 
1130  clip foregroundClip() const;
1131 
1141  bool setBackgroundClip(clip c) const;
1142 
1150  clip backgroundClip() const;
1151 
1166  double setPlaybackStartTime(double time) const;
1167 
1180  int setVideoPlaybackFrame(int frame, bool background = false) const;
1181 
1197  double videoPlaybackTime(bool background = false) const;
1198 
1210  double setAudioPlaybackTime(double time) const;
1211 
1225  double audioPlaybackTime() const;
1226 
1235  double elapsedTime() const;
1236 
1248  double setCurrentFPS(double fps) const;
1249 
1258  double currentFPS() const;
1259 
1268  int currentAudioRate() const;
1269 
1278  lives_loop_mode_t setLoopMode(lives_loop_mode_t mode) const;
1279 
1286  lives_loop_mode_t loopMode() const;
1287 
1297  bool setPingPong(bool setting) const;
1298 
1308  bool pingPong() const;
1309 
1317  bool resyncFPS() const;
1318 
1319 
1323  inline bool operator==(const player &other) const {
1324  return other.m_lives == m_lives;
1325  }
1326 
1327 
1328 protected:
1329  player(livesApp *lives = NULL);
1330 
1331 private:
1332  livesApp *m_lives;
1333 
1334 };
1335 
1337 
1344 class effectKey {
1345  friend effectKeyMap;
1346 public:
1350  effectKey();
1351 
1358  bool isValid() const;
1359 
1368  int key();
1369 
1376  int numModes();
1377 
1384  int numMappedModes();
1385 
1395  int setCurrentMode(int mode);
1396 
1403  int currentMode();
1404 
1413  bool setEnabled(bool setting);
1414 
1421  bool enabled();
1422 
1431  int appendMapping(effect e);
1432 
1444  bool removeMapping(int mode);
1445 
1452  effect at(int mode);
1453 
1454 
1455 
1456 
1457 
1461  inline bool operator==(const effectKey &other) {
1462  return other.m_key == m_key && m_lives == other.m_lives;
1463  }
1464 
1465 protected:
1466  effectKey(livesApp *lives, int key);
1467 
1468 private:
1469  int m_key;
1470  livesApp *m_lives;
1471 
1472 };
1473 
1474 
1475 
1482 class effectKeyMap {
1483  friend livesApp;
1484 public:
1491  bool isValid() const;
1492 
1498  bool clear() const;
1499 
1508  effectKey at(int i) const;
1509 
1517  size_t size() const;
1518 
1522  inline bool operator==(const effectKeyMap &other) const {
1523  return other.m_lives == m_lives;
1524  }
1525 
1532  inline effectKey operator [](int i) const {
1533  return effectKey(m_lives, i);
1534  }
1535 
1536 
1537 protected:
1538  effectKeyMap(livesApp *lives);
1539 
1540 private:
1541  livesApp *m_lives;
1542 };
1543 
1544 
1545 
1550 class effect {
1551  friend effectKey;
1552  friend multitrack;
1553 public:
1568  effect(const livesApp &lives, livesString hashname, bool match_full = false);
1569 
1585  effect(const livesApp &lives, livesString package, livesString fxname, livesString author = livesString(), int version = 0);
1586 
1593  bool isValid() const;
1594 
1598  inline bool operator==(const effect &other) {
1599  return other.m_idx == m_idx && m_lives == other.m_lives;
1600  }
1601 
1602 protected:
1603  effect();
1604  effect(livesApp *m_lives, int idx);
1605  livesApp *m_lives;
1606  int m_idx;
1607 
1608 private:
1609 
1610 };
1611 
1612 
1613 
1619 class block {
1620  friend multitrack;
1621 
1622 public:
1623 
1630  bool isValid() const;
1631 
1639  block(multitrack m, int track, double time);
1640 
1646  double startTime();
1647 
1653  double length();
1654 
1660  clip clipSource();
1661 
1668  int track();
1669 
1679  bool remove();
1680 
1694  bool moveTo(int track, double time);
1695 
1696 
1697 
1698 protected:
1702  block(multitrack *m = NULL, ulong uid = 0l);
1703 
1704 
1705 private:
1706  ulong m_uid;
1707  livesApp *m_lives;
1708 
1709  void invalidate();
1710 };
1711 
1712 
1713 
1718 class multitrack {
1719  friend livesApp;
1720  friend block;
1721 
1722 public:
1723 
1729  bool isValid() const;
1730 
1735  bool isActive() const;
1736 
1744  bool setCurrentTrack(int track) const;
1745 
1754  int currentTrack() const;
1755 
1766  double setCurrentTime(double time) const;
1767 
1778  double currentTime() const;
1779 
1786  livesString trackLabel(int track) const;
1787 
1797  bool setTrackLabel(int track, livesString label = livesString()) const;
1798 
1806  lives_gravity_t gravity() const;
1807 
1815  lives_gravity_t setGravity(lives_gravity_t mode) const;
1816 
1824  lives_insert_mode_t insertMode() const;
1825 
1833  lives_insert_mode_t setInsertMode(lives_insert_mode_t mode) const;
1834 
1835 
1841  int addVideoTrack(bool in_front) const;
1842 
1843 
1849  int numVideoTracks() const;
1850 
1851 
1856  int numAudioTracks() const;
1857 
1858 
1864  double FPS() const;
1865 
1890  block insertBlock(clip c, bool ignore_selection_limits = false, bool without_audio = false) const;
1891 
1901  livesString wipeLayout(bool force = false) const;
1902 
1910  livesString chooseLayout() const;
1911 
1918  livesStringList availableLayouts() const;
1919 
1932  bool reloadLayout(livesString filename) const;
1933 
1949  livesString saveLayout(livesString name) const;
1950 
1965  livesString saveLayout() const;
1966 
1977  clip render(bool render_audio = true, bool normalise_audio = true) const;
1978 
1987  effect autoTransition() const;
1988 
1996  bool disableAutoTransition() const;
1997 
2008  bool setAutoTransition(effect autotrans) const;
2009 
2013  inline bool operator==(const multitrack &other) const {
2014  return m_lives == other.m_lives;
2015  }
2016 
2017 
2018 protected:
2019  multitrack(livesApp *lives = NULL);
2020 
2024  livesApp *m_lives;
2025 
2026 
2027 };
2028 
2029 
2030 
2031 
2032 
2033 
2039 namespace prefs {
2044 livesString currentVideoLoadDir(const livesApp &lives);
2045 
2050 livesString currentAudioDir(const livesApp &lives);
2051 
2066 livesString tmpDir(const livesApp &lives);
2067 
2073 lives_audio_source_t audioSource(const livesApp &lives);
2074 
2081 bool setAudioSource(const livesApp &lives, lives_audio_source_t asrc);
2082 
2087 lives_audio_player_t audioPlayer(const livesApp &lives);
2088 
2096 int audioPlayerRate(const livesApp &lives);
2097 
2103 
2108 int rteKeysVirtual(const livesApp &lives);
2109 
2114 double maxFPS(const livesApp &lives);
2115 
2121 bool audioFollowsVideoChanges(const livesApp &lives);
2122 
2128 bool audioFollowsFPSChanges(const livesApp &lives);
2129 
2136 bool setAudioFollowsFPSChanges(const livesApp &lives, bool setting);
2137 
2144 bool setAudioFollowsVideoChanges(const livesApp &lives, bool setting);
2145 
2152 bool sepWinSticky(const livesApp &lives);
2153 
2160 bool setSepWinSticky(const livesApp &lives, bool);
2161 
2168 bool mtExitRender(const livesApp &lives);
2169 
2177 bool setMtExitRender(const livesApp &lives, bool setting);
2178 
2179 
2180 }
2181 
2182 
2183 }
2184 
2185 #endif // __cplusplus
2186 
2187 #endif //HAS_LIBLIVES_H
livesString currentAudioDir(const livesApp &lives)
Definition: liblives.cpp:2219
Definition: liblives.hpp:175
application is processing, commands will be ignored
Definition: liblives.hpp:65
Abort button clicked.
Definition: liblives.hpp:137
livesString tmpDir(const livesApp &lives)
Definition: liblives.cpp:2224
lives_audio_source_t
Definition: liblives.hpp:150
Reset button clicked.
Definition: liblives.hpp:138
8 bit locale file encoding
Definition: liblives.hpp:118
bool sepWinSticky(const livesApp &lives)
Definition: liblives.cpp:2297
No button clicked.
Definition: liblives.hpp:143
application is playing, only player commands will be responded to
Definition: liblives.hpp:64
sent when interface mode changes
Definition: liblives.hpp:102
sent when livesApp object is deleted
Definition: liblives.hpp:104
multitrack mode
Definition: liblives.hpp:53
bool audioFollowsVideoChanges(const livesApp &lives)
Definition: liblives.cpp:2277
file chooser options for single video or audio file
Definition: liblives.hpp:41
bool setMtExitRender(const livesApp &lives, bool setting)
Definition: liblives.cpp:2312
lives_filechooser_t
Definition: liblives.hpp:40
Audio source is external to LiVES.
Definition: liblives.hpp:153
bool setSepWinSticky(const livesApp &lives, bool setting)
Definition: liblives.cpp:2302
sent when app quits
Definition: liblives.hpp:93
clip editor mode
Definition: liblives.hpp:52
Unknown / invalid.
Definition: liblives.hpp:161
lives_endian_t
Definition: liblives.hpp:73
Audio playback is through PulseAudio.
Definition: liblives.hpp:162
lives_insert_mode_t
Definition: liblives.hpp:174
livesString currentVideoLoadDir(const livesApp &lives)
Definition: liblives.cpp:2214
livesApp instance is invalid
Definition: liblives.hpp:61
Definition: liblives.hpp:74
double maxFPS(const livesApp &lives)
Definition: liblives.cpp:2272
bool setAudioFollowsFPSChanges(const livesApp &lives, bool setting)
Definition: liblives.cpp:2292
file system encoding (UTF-8 on windows, local8bit on others)
Definition: liblives.hpp:119
int audioPlayerRate(const livesApp &lives)
Definition: liblives.cpp:2248
Audio source is internal to LiVES.
Definition: liblives.hpp:152
sent when a frame is displayed
Definition: liblives.hpp:83
lives_loop_mode_t
Definition: liblives.hpp:194
lives_audio_player_t
Definition: liblives.hpp:160
Audio playback is through mplayer2.
Definition: liblives.hpp:166
sent after a clip is opened
Definition: liblives.hpp:95
Audio playback is through mplayer.
Definition: liblives.hpp:165
const char * version(void)
Yes button clicked.
Definition: liblives.hpp:142
application is ready for commands
Definition: liblives.hpp:63
inserted blocks gravitate to the left
Definition: liblives.hpp:185
sent after a clip set is opened
Definition: liblives.hpp:99
UTF-8 char encoding.
Definition: liblives.hpp:117
Definition: liblives.hpp:88
lives_dialog_response_t
Definition: liblives.hpp:131
#define LIVES_CHAR_ENCODING_DEFAULT
Definition: liblives.hpp:126
no looping
Definition: liblives.hpp:195
user is previewing an operation, commands will be ignored
Definition: liblives.hpp:66
Unknown / invalid.
Definition: liblives.hpp:151
OK button clicked.
Definition: liblives.hpp:135
both video and audio loop continuously
Definition: liblives.hpp:196
_prefs * prefs
Definition: preferences.h:686
Accept button clicked.
Definition: liblives.hpp:141
lives_callback_t
Definition: liblives.hpp:82
sent after a clip is closed
Definition: liblives.hpp:96
sent after a clip set is closed
Definition: liblives.hpp:100
Definition: liblives.hpp:75
file chooser options for single audio file
Definition: liblives.hpp:42
lives_char_encoding_t
Definition: liblives.hpp:116
lives_mt * multitrack(weed_plant_t *event_list, int orig_file, double fps)
create and return lives_mt struct
Definition: multitrack.c:6129
livesApp instance is invalid
Definition: liblives.hpp:51
video keeps looping until audio playback finishes
Definition: liblives.hpp:197
bool audioFollowsFPSChanges(const livesApp &lives)
Definition: liblives.cpp:2282
#define ulong
Definition: main.h:137
sent when record starts (TODO)
Definition: liblives.hpp:90
int rteKeysVirtual(const livesApp &lives)
Definition: liblives.cpp:2267
sent when a/v playback starts or clip is switched
Definition: liblives.hpp:84
lives_interface_mode_t
Definition: liblives.hpp:50
Retry button clicked.
Definition: liblives.hpp:136
Definition: liblives.cpp:56
bool mtExitRender(const livesApp &lives)
Definition: liblives.cpp:2307
sent when record stops (TODO)
Definition: liblives.hpp:91
lives_status_t
Definition: liblives.hpp:60
Audio playback is through Sox.
Definition: liblives.hpp:164
for internal use
Definition: liblives.hpp:107
lives_audio_source_t audioSource(const livesApp &lives)
Definition: liblives.cpp:2229
application is starting up; not ready
Definition: liblives.hpp:62
Definition: liblives.hpp:85
bool setAudioSource(const livesApp &lives, lives_audio_source_t asrc)
Definition: liblives.cpp:2235
Cancel button clicked.
Definition: liblives.hpp:140
void binding_cb(lives_callback_t cb_type, const char *msgstring, ulong id)
Definition: liblives.cpp:2324
Response not obtained.
Definition: liblives.hpp:134
Audio playback is thorugh Jack.
Definition: liblives.hpp:163
inserted blocks gravitate to the right
Definition: liblives.hpp:186
lives_audio_player_t audioPlayer(const livesApp &lives)
Definition: liblives.cpp:2240
Show details button clicked.
Definition: liblives.hpp:139
lives_gravity_t
Definition: liblives.hpp:183
bool isRealtimeAudioPlayer(lives_audio_player_t player_type)
Definition: liblives.cpp:2259
no gravity
Definition: liblives.hpp:184
INVALID response.
Definition: liblives.hpp:133
bool setAudioFollowsVideoChanges(const livesApp &lives, bool setting)
Definition: liblives.cpp:2287