Go to the documentation of this file.
6 #include <QApplication>
47 m_parentScreen(parentScreen)
231 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicCommon: Got a bad saved visualizer: %1").arg(
m_currentVisual));
448 if (plview->Create())
464 auto *oldView = qobject_cast<PlaylistEditorView *>(
this);
466 oldView->saveTreePosition();
472 if (pleview->Create())
494 auto *oldView = qobject_cast<PlaylistEditorView *>(
this);
496 oldView->saveTreePosition();
500 auto *pleview =
new PlaylistEditorView(mainStack, parentScreen,
"gallery", restorePos);
502 if (pleview->Create())
521 auto *sview =
new SearchView(mainStack,
this);
551 auto *lview =
new LyricsView(mainStack,
this);
578 bool handled =
false;
595 for (
int i = 0; i < actions.size() && !handled; i++)
597 QString
action = actions[i];
624 else if (
action ==
"DOWN")
659 if (exit_action ==
"stop")
665 else if (exit_action ==
"play")
672 else if (
action ==
"THMBUP")
674 else if (
action ==
"THMBDOWN")
676 else if (
action ==
"NEXTTRACK")
683 else if (
action ==
"PREVTRACK")
690 else if (
action ==
"FFWD")
700 else if (
action ==
"RWND")
710 else if (
action ==
"PAUSE")
733 else if (
action ==
"PLAY")
740 else if (
action ==
"STOP")
748 else if (
action ==
"CYCLEVIS")
750 else if (
action ==
"BLANKSCR")
760 else if (
action ==
"VOLUMEDOWN")
762 else if (
action ==
"VOLUMEUP")
764 else if (
action ==
"SPEEDDOWN")
766 else if (
action ==
"SPEEDUP")
768 else if (
action ==
"MUTE")
770 else if (
action ==
"TOGGLEUPMIX")
806 else if (
action ==
"MENU")
808 else if (
action ==
"REFRESH")
813 else if (
action ==
"MARK")
852 else if (
action ==
"TOGGLESHUFFLE")
857 else if (
action ==
"TOGGLEREPEAT")
924 QString status = QString(
"%1%").arg((
int)(100.0 / ((
double)maxSize / (
double)available)));
937 int percentplayed = 1;
997 unsigned int next_visualizer = 0;
1048 lcd->switchToTime();
1098 nextTime = std::clamp(nextTime, 0s,
m_maxTime);
1105 nextTime = std::clamp(nextTime, 0s,
m_maxTime);
1117 decoder->
seek(pos.count());
1141 float percent_heard =
m_maxTime <= 0s ? 0.0F : ((float)pos.count() /
1147 if (lcd_time_string.length() > (
int)lcd->getLCDWidth())
1148 lcd_time_string.remove(
' ');
1150 lcd->setMusicProgress(lcd_time_string, percent_heard);
1182 QString statusString;
1190 statusString = tr(
"Playing stream.");
1219 statusString = tr(
"Buffering stream.");
1223 statusString = tr(
"Stream paused.");
1252 std::chrono::seconds rs = 0s;
1274 0.0F:((float)rs.count() / (float)curMeta->
Length().count()) * 1000.0F;
1276 QString lcd_time_string = time_string;
1279 if (time_string.length() > (int)lcd->getLCDWidth())
1280 lcd_time_string.remove(
' ');
1282 lcd->setMusicProgress(lcd_time_string, percent_heard);
1286 QString info_string;
1289 if (oe->bitrate() < 2000)
1291 info_string = QString(
"%1 "+tr(
"kbps")+
" %2 "+ tr(
"kHz")+
" %3 "+ tr(
"ch"))
1293 .arg(
static_cast<double>(oe->frequency()) / 1000.0,0,
'f',1,QChar(
'0'))
1294 .arg(oe->channels() > 1 ?
"2" :
"1");
1298 info_string = QString(
"%1 "+ tr(
"kHz")+
" %2 "+ tr(
"ch"))
1299 .arg(
static_cast<double>(oe->frequency()) / 1000.0,0,
'f',1,QChar(
'0'))
1300 .arg(oe->channels() > 1 ?
"2" :
"1");
1316 statusString = tr(
"Stream stopped.");
1343 if ((dce ==
nullptr) || (dce->GetResult() < 0))
1346 QString resultid = dce->
GetId();
1347 QString resulttext = dce->GetResultText();
1349 if (resultid ==
"mainmenu")
1351 if (resulttext == tr(
"Fullscreen Visualizer"))
1353 else if (resulttext == tr(
"Playlist Editor"))
1360 else if (resulttext == tr(
"Search for Music"))
1362 else if (resulttext == tr(
"Switch To Gallery View"))
1364 else if (resulttext == tr(
"Switch To Tree View"))
1366 else if (resulttext == tr(
"Lyrics"))
1369 else if (resultid ==
"submenu")
1371 if (resulttext == tr(
"Search List..."))
1374 else if (resultid ==
"playlistmenu")
1376 if (resulttext == tr(
"Sync List With Current Track"))
1380 else if (resulttext == tr(
"Remove Selected Track"))
1390 else if (resulttext == tr(
"Remove All Tracks"))
1398 else if (resulttext == tr(
"Save To New Playlist"))
1400 QString message = tr(
"Enter new playlist name");
1406 if (inputdialog->Create())
1408 inputdialog->SetReturnEvent(
this,
"addplaylist");
1414 else if (resulttext == tr(
"Save To Existing Playlist"))
1416 QString message = tr(
"Select the playlist to save to");
1423 if (searchdialog->Create())
1425 searchdialog->SetReturnEvent(
this,
"updateplaylist");
1429 else if (resulttext == tr(
"Switch To Move Mode"))
1437 else if (resulttext == tr(
"Switch To Select Mode"))
1454 else if (resultid ==
"repeatmenu")
1456 int mode = dce->GetData().toInt();
1460 else if (resultid ==
"shufflemenu")
1462 int mode = dce->GetData().toInt();
1466 else if (resultid ==
"exitmenu")
1468 if (resulttext == tr(
"No - Exit, Stop Playing"))
1474 else if (resulttext == tr(
"Yes - Exit, Continue Playing"))
1479 else if (resultid ==
"playermenu")
1481 if (resulttext == tr(
"Change Volume"))
1483 else if (resulttext == tr(
"Mute"))
1485 else if (resulttext == tr(
"Previous Track"))
1487 else if (resulttext == tr(
"Next Track"))
1489 else if (resulttext == tr(
"Jump Back"))
1491 else if (resulttext == tr(
"Jump Forward"))
1493 else if (resulttext == tr(
"Play"))
1495 else if (resulttext == tr(
"Stop"))
1497 else if (resulttext == tr(
"Pause"))
1500 else if (resultid ==
"quickplaylistmenu")
1502 if (resulttext == tr(
"All Tracks"))
1504 else if (resulttext == tr(
"From CD"))
1506 else if (resulttext == tr(
"Tracks By Current Artist"))
1508 else if (resulttext == tr(
"Tracks From Current Genre"))
1510 else if (resulttext == tr(
"Tracks From Current Album"))
1512 else if (resulttext == tr(
"Tracks From Current Year"))
1514 else if (resulttext == tr(
"Tracks With Same Title"))
1517 else if (resultid ==
"playlistoptionsmenu")
1519 if (resulttext == tr(
"Replace Tracks"))
1524 else if (resulttext == tr(
"Add Tracks"))
1530 else if (resultid ==
"visualizermenu")
1532 if (dce->GetResult() >= 0)
1540 else if (resultid ==
"addplaylist")
1546 else if (resultid ==
"updateplaylist")
1570 if (
m_currentTrack >= 0 && m_currentTrack < m_currentPlaylist->GetCount())
1580 if (trackNo >= 0 && trackNo < m_currentPlaylist->GetCount())
1679 mdata->
toMap(metadataMap);
1682 QVariant::fromValue(mdata));
1684 item->SetTextFromMap(metadataMap);
1689 item->SetFontState(
"running");
1690 item->DisplayState(
"playing",
"playstate");
1694 item->SetFontState(
"normal");
1695 item->DisplayState(
"default",
"playstate");
1737 if (mdata && mdata->ID() == trackID)
1740 mdata->
toMap(metadataMap);
1743 item->
DisplayState(QString(
"%1").arg(mdata->Rating()),
"ratingstate");
1755 if (mdata && mdata->ID() == trackID)
1758 mdata->
toMap(metadataMap);
1786 if (mdata && mdata->ID() == trackID)
1792 if (artFile.isEmpty())
1799 item->
SetImage(mdata->getAlbumArtFile());
1800 item->
SetImage(mdata->getAlbumArtFile(),
"coverart");
1825 if (mdata && mdata->ID() == trackID)
1871 if (!editDialog->Create())
1886 metadata.
toMap(metadataMap);
1887 metadata.
toMap(metadataMap,
"next");
1914 mdata->
toMap(metadataMap);
1919 nextMetadata->
toMap(metadataMap,
"next");
1987 if (mdata && item->
GetText() ==
" ")
1992 if (artFile.isEmpty())
1999 item->
SetImage(mdata->getAlbumArtFile());
2000 item->
SetImage(mdata->getAlbumArtFile(),
"coverart");
2005 mdata->toMap(metadataMap);
2008 item->
DisplayState(QString(
"%1").arg(mdata->Rating()),
"ratingstate");
2035 QVariant::fromValue(mdata));
2037 item->SetText(mdata->
Artist() + mdata->
Album() + mdata->
Title(),
"**search**");
2038 item->SetFontState(
"normal");
2039 item->DisplayState(
"default",
"playstate");
2046 item->SetFontState(
"running");
2047 item->DisplayState(
"playing",
"playstate");
2051 item->SetFontState(
"idle");
2052 item->DisplayState(
"paused",
"playstate");
2056 item->SetFontState(
"normal");
2057 item->DisplayState(
"stopped",
"playstate");
2076 for (
int x = playedList.count(); x > 0; x--)
2080 QVariant::fromValue(mdata));
2083 mdata->
toMap(metadataMap);
2084 item->SetTextFromMap(metadataMap);
2086 item->SetFontState(
"normal");
2087 item->DisplayState(
"default",
"playstate");
2103 QString playlistcurrent = QLocale::system().toString(
m_currentTrack + 1);
2104 QString playlisttotal = QLocale::system().toString(trackCount);
2106 map[
"playlistposition"] = tr(
"%1 of %2").arg(playlistcurrent, playlisttotal);
2107 map[
"playlistcurrent"] = playlistcurrent;
2108 map[
"playlistcount"] = playlisttotal;
2113 if (playlistName ==
"default_playlist_storage")
2114 playlistName = tr(
"Default Playlist");
2115 else if (playlistName ==
"stream_playlist")
2116 playlistName = tr(
"Stream Playlist");
2117 map[
"playlistname"] = playlistName;
2121 map[
"playlistposition"] =
"";
2122 map[
"playlistcurrent"] =
"";
2123 map[
"playlistcount"] =
"";
2124 map[
"playlisttime"] =
"";
2125 map[
"playlistplayedtime"] =
"";
2126 map[
"playlisttotaltime"] =
"";
2127 map[
"playlistname"] =
"";
2140 (exTime >= 1h) ?
"H:mm:ss" :
"mm:ss");
2142 QString fmt = (maxTime >= 1h) ?
"H:mm:ss" :
"mm:ss";
2163 auto *menuPopup =
new MythDialogBox(mainMenu, popupStack,
"actionmenu");
2165 if (menuPopup->Create())
2173 QString label = tr(
"View Actions");
2178 menu->AddItem(tr(
"Switch To Gallery View"));
2180 menu->AddItem(tr(
"Switch To Tree View"));
2182 menu->AddItem(MusicCommon::tr(
"Playlist Editor"));
2184 QStringList screenList;
2188 screenList.append(screen->objectName());
2189 screen = qobject_cast<MusicCommon*>(screen)->m_parentScreen;
2192 if (!screenList.contains(
"searchview") && !screenList.contains(
"streamview"))
2193 menu->AddItem(tr(
"Search for Music"));
2195 if (!screenList.contains(
"visualizerview"))
2196 menu->AddItem(tr(
"Fullscreen Visualizer"));
2198 if (!screenList.contains(
"lyricsview"))
2199 menu->AddItem(tr(
"Lyrics"));
2208 QString label = tr(
"Actions");
2214 menu->AddItem(tr(
"Search List..."));
2236 QString label = tr(
"Playlist Options");
2238 auto *
menu =
new MythMenu(label,
this,
"playlistmenu");
2242 menu->AddItem(tr(
"Sync List With Current Track"));
2243 menu->AddItem(tr(
"Remove Selected Track"));
2246 menu->AddItem(tr(
"Remove All Tracks"));
2250 menu->AddItem(tr(
"Save To New Playlist"));
2251 menu->AddItem(tr(
"Save To Existing Playlist"));
2254 menu->AddItem(tr(
"Switch To Select Mode"));
2256 menu->AddItem(tr(
"Switch To Move Mode"));
2264 QString label = tr(
"Exiting Music Player.\n\n"
2265 "Do you want to continue playing in the background?");
2277 menu->SetReturnEvent(
this,
"exitmenu");
2279 menu->AddButton(tr(
"No - Exit, Stop Playing"));
2280 menu->AddButton(tr(
"Yes - Exit, Continue Playing"));
2281 menu->AddButton(tr(
"Cancel"));
2288 QString label = tr(
"Player Actions");
2292 menu->AddItem(tr(
"Change Volume"));
2293 menu->AddItem(tr(
"Mute"));
2294 menu->AddItem(tr(
"Previous Track"));
2295 menu->AddItem(tr(
"Next Track"));
2299 menu->AddItem(tr(
"Jump Back"));
2300 menu->AddItem(tr(
"Jump Forward"));
2303 menu->AddItem(tr(
"Play"));
2304 menu->AddItem(tr(
"Stop"));
2307 menu->AddItem(tr(
"Pause"));
2314 QString label = tr(
"Set Repeat Mode");
2329 QString label = tr(
"Set Shuffle Mode");
2346 QString label = tr(
"Quick Playlists");
2348 auto *
menu =
new MythMenu(label,
this,
"quickplaylistmenu");
2350 menu->AddItem(tr(
"All Tracks"));
2353 menu->AddItem(tr(
"From CD"));
2357 menu->AddItem(tr(
"Tracks By Current Artist"));
2358 menu->AddItem(tr(
"Tracks From Current Album"));
2359 menu->AddItem(tr(
"Tracks From Current Genre"));
2360 menu->AddItem(tr(
"Tracks From Current Year"));
2361 menu->AddItem(tr(
"Tracks With Same Title"));
2369 QString label = tr(
"Choose Visualizer");
2371 auto *
menu =
new MythMenu(label,
this,
"visualizermenu");
2383 QString label = tr(
"Add to Playlist Options");
2385 auto *
menu =
new MythMenu(label,
this,
"playlistoptionsmenu");
2387 menu->AddItem(tr(
"Replace Tracks"));
2388 menu->AddItem(tr(
"Add Tracks"));
2395 m_whereClause =
"ORDER BY music_artists.artist_name, album_name, disc_number, track";
2424 m_whereClause =
"WHERE music_artists.artist_name = " + value +
2425 " ORDER BY album_name, disc_number, track";
2438 " ORDER BY disc_number, track";
2451 " ORDER BY music_artists.artist_name, album_name, disc_number, track";
2464 " ORDER BY music_artists.artist_name, album_name, disc_number, track";
2477 " ORDER BY music_artists.artist_name, album_name, disc_number, track";
2506 if (menuPopup->Create())
2514 int curTrackID = -1;
2605 bool foundTrack =
false;
2680 QStringList actions;
2683 for (
int i = 0; i < actions.size() && !handled; i++)
2685 QString
action = actions[i];
2779 QStringList actions;
2782 for (
int i = 0; i < actions.size() && !handled; i++)
2784 QString
action = actions[i];
void addVisual(MainVisual *visual)
MythUIStateType * m_movingTracksState
Decoder * getDecoder(void)
MythScreenStack * GetMainStack()
void init(bool startPlayback=true)
static void editTrackInfo(MusicMetadata *mdata)
MythUIText * m_trackProgressText
AudioOutput * getOutput(void)
Provide a dialog to quickly find an entry in a list.
MusicMetadata * getSongAt(int pos) const
QString formattedFieldValue(const QVariant &value)
bool setCurrentTrackPos(int pos)
RepeatMode getRepeatMode(void)
Image widget, displays a single image or multiple images in sequence.
MythUIStateType * m_repeatState
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
static void setTrackOnLCD(MusicMetadata *mdata)
MythUIButton * m_playButton
void toMap(InfoMap &infoMap) const
MythUIText * m_trackSpeedText
MythUIButton * m_ffButton
void switchView(MusicView view)
virtual void ResetMap(const InfoMap &infoMap)
MythMenu * createPlaylistOptionsMenu(void)
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
void showPlaylistOptionsMenu(bool addMainMenu=false)
void playlistItemClicked(MythUIButtonListItem *item)
MythMenu * createVisualizerMenu(void)
MythUIStateType * m_muteState
bool Load(bool allowLoadInBackground=true, bool forceStat=false)
Load the image(s), wraps ImageLoader::LoadImage()
MythMenu * createSubMenu(void)
InsertPLOption insertPLOption
void toggleMute(void) const
void updatePlaylistStats(void)
static constexpr std::chrono::milliseconds MUSICVOLUMEPOPUPTIME
static Type TrackStatsChangedEvent
QString formatTime(std::chrono::milliseconds msecs, QString fmt)
Format a milliseconds time value.
void setShuffleMode(ShuffleMode mode)
void doUpdatePlaylist(void)
~MusicCommon(void) override
static void playFirstTrack()
int getCurrentTrackPos(void) const
static Type TrackAddedEvent
bool isPlaying(void) const
MythUIStateType * m_ratingState
MythUIButton * m_rewButton
void copyNewPlaylist(const QString &name)
static void showTrackInfo(MusicMetadata *mdata)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MythUIButton * m_pauseButton
Screen in which all other widgets are contained and rendered.
static void show(uint8_t *buf, int length)
MythMenu * createPlaylistMenu(void)
static Type MetadataChangedEvent
void switchVisualizer(const QString &visual)
QStringList getPlaylistNames(void)
Playlist * getCurrentPlaylist(void)
void Reset(void) override
Reset the image back to the default defined in the theme.
void removeListener(QObject *listener)
static void startPlayback(void)
void prepare(void) override
void setPlayMode(PlayMode mode)
PlayMode getPlayMode(void)
QString toRawSonglist(bool shuffled=false, bool tracksOnly=false)
static void changeSpeed(bool up)
void changeCurrentTrack(int trackNo)
change the current track to the given track
MusicMetadata * getCDMetadata(int m_the_track)
MythUIType * GetFocusWidget(void) const
void setVisual(const QString &name)
Playlist * getActive(void)
QStringList m_visualModes
PlaylistOptions m_playlistOptions
QHash< QString, QString > InfoMap
void sendTrackStatsChangedEvent(int trackID)
MusicMetadata * getCurrentMetadata(void)
get the metadata for the current track in the playlist
static void showVolume(void)
std::chrono::seconds m_currentTime
static QString getTimeString(std::chrono::seconds exTime, std::chrono::seconds maxTime)
RepeatMode toggleRepeatMode(void)
unsigned int m_currentVisual
static Type TrackChangeEvent
void fillSonglistFromQuery(const QString &whereClause, bool removeDuplicates=false, InsertPLOption insertOption=PL_REPLACE, int currentTrackID=0)
void removeVisual(MainVisual *visual)
std::chrono::seconds m_maxTime
virtual void unlock(void)
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
uint m_playlistTrackCount
ShuffleMode toggleShuffleMode(void)
MythUIProgressBar * m_playlistProgress
static void playlistItemVisible(MythUIButtonListItem *item)
Basic menu dialog, message and a list of options.
static MythThemedMenu * menu
MythUIButton * m_prevButton
MythMenu * createQuickPlaylistsMenu(void)
std::chrono::seconds m_playlistMaxTime
virtual void SetTextFromMap(const InfoMap &infoMap)
Playlist * getPlaylist(int id)
MythUIButtonList * m_currentPlaylist
@ MV_PLAYLISTEDITORGALLERY
void updateProgressBar(void)
void stopVisualizer(void)
int getCDTrackCount(void) const
MainVisual * m_mainvisual
MythMenu * createRepeatMenu(void)
ShuffleMode getShuffleMode(void)
void playlistChanged(int playlistID)
MusicMetadata * getMetadata(int an_id)
void removeTrack(int trackID)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
PlaylistContainer * m_all_playlists
void updateUIPlayedList(void)
void updateRepeatMode(void)
static Type AllTracksRemovedEvent
MythUIStateType * m_trackState
MythMenu * createShuffleMenu(void)
MythUIImage * m_coverartImage
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
MusicMetadata * m_metadata
MythUIVideo * m_visualizerVideo
MythMenu * createPlayerMenu(void)
bool GetBoolSetting(const QString &key, bool defaultval=false)
static void changeRating(bool increase)
MythUIButton * m_stopButton
@ PLAYMODE_TRACKSPLAYLIST
MusicMetadata * getNextMetadata(void)
get the metadata for the next track in the playlist
QStringList getVisualizations(void)
int getCurrentVisual(void) const
void updateTrackInfo(MusicMetadata *mdata)
QList< MusicMetadata * > & getPlayedTracksList(void)
MythUIProgressBar * m_trackProgress
MythMenu * createMainMenu(void)
All purpose text widget, displays a text string.
void updateShuffleMode(bool updateUIList=false)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
static Type TrackUnavailableEvent
void activePlaylistChanged(int trackID, bool deleted)
void setRepeatMode(RepeatMode mode)
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
void searchButtonList(void)
void cycleVisualizer(void)
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static Type VolumeChangeEvent
static void showSpeed(bool show)
void SetTextFromMap(const InfoMap &map)
static Type TrackRemovedEvent
void getStats(uint *trackCount, std::chrono::seconds *totalLength, uint currentTrack=0, std::chrono::seconds *playedLength=nullptr) const
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
void changeVolume(bool up) const
void startVisualizer(void)
MythMainWindow * GetMythMainWindow(void)
std::chrono::seconds m_playlistPlayedTime
bool isRunning(void) const
void setAllowRestorePos(bool allow)
MythUIButtonList * m_playedTracksList
void switchToMusic(const QString &artist, const QString &album, const QString &track)
PlayPLOption playPLOption
void restorePosition(void)
MythScreenStack * GetStack(const QString &Stackname)
MusicCommon(MythScreenStack *parent, MythScreenType *parentScreen, const QString &name)
void updateUIPlaylist(void)
void fillSongsFromSonglist(const QString &songList)
void removeAllTracks(void)
void stop(bool stopAll=false)
MythUIText * m_volumeText
void fillSonglistFromList(const QList< int > &songList, bool removeDuplicates, InsertPLOption insertOption, int currentTrackID)
Dialog prompting the user to enter a text string.
void getBufferStatus(int *bufferAvailable, int *bufferSize) const
void SetFilename(const QString &filename)
Must be followed by a call to Load() to load the image.
MythUIStateType * m_shuffleState
static Type AlbumArtChangedEvent
MythUIText * m_visualText
virtual void seek(double)=0
MythUIText * m_noTracksText
uint getVolume(void) const
MythScreenType * m_parentScreen
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
void seek(std::chrono::seconds pos)
bool restorePosition(int trackID)
uint32_t MythRandom()
generate 32 random bits
virtual bool ToggleUpmix(void)
void customEvent(QEvent *event) override
bool Create(void) override
MythUIButton * m_nextButton
This widget is used for grouping other widgets for display when a particular named state is called....
virtual bool IsPaused(void) const =0
void addListener(QObject *listener)
static void toggleUpmix(void)
bool DisplayState(const QString &name)
void ShowMenu(void) override
virtual void SetTimecode(std::chrono::milliseconds timecode)=0
QString GetSetting(const QString &key, const QString &defaultval="")
void moveTrackUpDown(bool moveUp, int whichTrack)