Added WAV file recording capability to Qt GUI.
This commit is contained in:
parent
d7ca6ccc18
commit
0b689d65c4
|
@ -47,6 +47,7 @@
|
||||||
#include "../../file.h"
|
#include "../../file.h"
|
||||||
#include "../../input.h"
|
#include "../../input.h"
|
||||||
#include "../../movie.h"
|
#include "../../movie.h"
|
||||||
|
#include "../../wave.h"
|
||||||
#include "../../version.h"
|
#include "../../version.h"
|
||||||
#include "common/os_utils.h"
|
#include "common/os_utils.h"
|
||||||
|
|
||||||
|
@ -1533,6 +1534,45 @@ void consoleWin_t::createMainMenu(void)
|
||||||
connect(act, SIGNAL(triggered(bool)), this, SLOT(aviAudioEnableChange(bool)) );
|
connect(act, SIGNAL(triggered(bool)), this, SLOT(aviAudioEnableChange(bool)) );
|
||||||
aviMenu->addAction(act);
|
aviMenu->addAction(act);
|
||||||
|
|
||||||
|
// Movie -> WAV Recording
|
||||||
|
subMenu = movieMenu->addMenu( tr("&WAV Recording") );
|
||||||
|
|
||||||
|
// Movie -> Avi Recording -> Record
|
||||||
|
recWavAct = new QAction(tr("&Record"), this);
|
||||||
|
//recWavAct->setShortcut( QKeySequence(tr("Shift+F5")));
|
||||||
|
recWavAct->setStatusTip(tr("WAV Record Start"));
|
||||||
|
recWavAct->setIcon( QIcon(":icons/media-record.png") );
|
||||||
|
connect(recWavAct, SIGNAL(triggered()), this, SLOT(wavRecordStart(void)) );
|
||||||
|
|
||||||
|
Hotkeys[ HK_RECORD_WAV ].setAction( recWavAct );
|
||||||
|
connect( Hotkeys[ HK_RECORD_WAV ].getShortcut(), SIGNAL(activated()), this, SLOT(wavRecordStart(void)) );
|
||||||
|
|
||||||
|
subMenu->addAction(recWavAct);
|
||||||
|
|
||||||
|
// Movie -> WAV Recording -> Record
|
||||||
|
recAsWavAct = new QAction(tr("Record &As"), this);
|
||||||
|
//recAsWavAct->setShortcut( QKeySequence(tr("Shift+F5")));
|
||||||
|
recAsWavAct->setStatusTip(tr("WAV Record As Start"));
|
||||||
|
//recAsWavAct->setIcon( QIcon(":icons/media-record.png") );
|
||||||
|
connect(recAsWavAct, SIGNAL(triggered()), this, SLOT(wavRecordAsStart(void)) );
|
||||||
|
|
||||||
|
Hotkeys[ HK_RECORD_WAV_TO ].setAction( recAsWavAct );
|
||||||
|
connect( Hotkeys[ HK_RECORD_WAV_TO ].getShortcut(), SIGNAL(activated()), this, SLOT(wavRecordAsStart(void)) );
|
||||||
|
|
||||||
|
subMenu->addAction(recAsWavAct);
|
||||||
|
|
||||||
|
// Movie -> WAV Recording -> Stop
|
||||||
|
stopWavAct = new QAction(tr("&Stop"), this);
|
||||||
|
//stopWavAct->setShortcut( QKeySequence(tr("Shift+F5")));
|
||||||
|
stopWavAct->setStatusTip(tr("WAV Record Stop"));
|
||||||
|
stopWavAct->setIcon( style()->standardIcon( QStyle::SP_MediaStop ) );
|
||||||
|
connect(stopWavAct, SIGNAL(triggered()), this, SLOT(wavRecordStop(void)) );
|
||||||
|
|
||||||
|
Hotkeys[ HK_STOP_WAV ].setAction( stopWavAct );
|
||||||
|
connect( Hotkeys[ HK_STOP_WAV ].getShortcut(), SIGNAL(activated()), this, SLOT(wavRecordStop(void)) );
|
||||||
|
|
||||||
|
subMenu->addAction(stopWavAct);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
// Help
|
// Help
|
||||||
helpMenu = menubar->addMenu(tr("&Help"));
|
helpMenu = menubar->addMenu(tr("&Help"));
|
||||||
|
@ -3283,6 +3323,131 @@ void consoleWin_t::aviVideoFormatChanged(int idx)
|
||||||
aviSetSelVideoFormat(idx);
|
aviSetSelVideoFormat(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void consoleWin_t::wavRecordStart(void)
|
||||||
|
{
|
||||||
|
if ( !FCEUI_WaveRecordRunning() )
|
||||||
|
{
|
||||||
|
const char *romFile;
|
||||||
|
char fileName[1024];
|
||||||
|
|
||||||
|
romFile = getRomFile();
|
||||||
|
|
||||||
|
if ( romFile )
|
||||||
|
{
|
||||||
|
char base[512];
|
||||||
|
const char *baseDir = FCEUI_GetBaseDirectory();
|
||||||
|
|
||||||
|
getFileBaseName( romFile, base );
|
||||||
|
|
||||||
|
if ( baseDir )
|
||||||
|
{
|
||||||
|
strcpy( fileName, baseDir );
|
||||||
|
strcat( fileName, "/wav/" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fileName[0] = 0;
|
||||||
|
}
|
||||||
|
strcat( fileName, base );
|
||||||
|
strcat( fileName, ".wav");
|
||||||
|
//printf("WAV Filepath:'%s'\n", fileName );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fceuWrapperLock();
|
||||||
|
FCEUI_BeginWaveRecord( fileName );
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void consoleWin_t::wavRecordAsStart(void)
|
||||||
|
{
|
||||||
|
if ( FCEUI_WaveRecordRunning() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int ret, useNativeFileDialogVal;
|
||||||
|
QString filename;
|
||||||
|
std::string last;
|
||||||
|
//char dir[512];
|
||||||
|
const char *base;
|
||||||
|
QFileDialog dialog(this, tr("Save WAV Movie for Recording") );
|
||||||
|
QList<QUrl> urls;
|
||||||
|
QDir d;
|
||||||
|
|
||||||
|
dialog.setFileMode(QFileDialog::AnyFile);
|
||||||
|
|
||||||
|
dialog.setNameFilter(tr("WAV Movies (*.wav) ;; All files (*)"));
|
||||||
|
|
||||||
|
dialog.setViewMode(QFileDialog::List);
|
||||||
|
dialog.setFilter( QDir::AllEntries | QDir::AllDirs | QDir::Hidden );
|
||||||
|
dialog.setLabelText( QFileDialog::Accept, tr("Save") );
|
||||||
|
|
||||||
|
base = FCEUI_GetBaseDirectory();
|
||||||
|
|
||||||
|
urls << QUrl::fromLocalFile( QDir::rootPath() );
|
||||||
|
urls << QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first());
|
||||||
|
urls << QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::DownloadLocation).first());
|
||||||
|
|
||||||
|
if ( base )
|
||||||
|
{
|
||||||
|
urls << QUrl::fromLocalFile( QDir( base ).absolutePath() );
|
||||||
|
|
||||||
|
d.setPath( QString(base) + "/wav");
|
||||||
|
|
||||||
|
if ( d.exists() )
|
||||||
|
{
|
||||||
|
urls << QUrl::fromLocalFile( d.absolutePath() );
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog.setDirectory( d.absolutePath() );
|
||||||
|
}
|
||||||
|
dialog.setDefaultSuffix( tr(".wav") );
|
||||||
|
|
||||||
|
// Check config option to use native file dialog or not
|
||||||
|
g_config->getOption ("SDL.UseNativeFileDialog", &useNativeFileDialogVal);
|
||||||
|
|
||||||
|
dialog.setOption(QFileDialog::DontUseNativeDialog, !useNativeFileDialogVal);
|
||||||
|
dialog.setSidebarUrls(urls);
|
||||||
|
|
||||||
|
ret = dialog.exec();
|
||||||
|
|
||||||
|
if ( ret )
|
||||||
|
{
|
||||||
|
QStringList fileList;
|
||||||
|
fileList = dialog.selectedFiles();
|
||||||
|
|
||||||
|
if ( fileList.size() > 0 )
|
||||||
|
{
|
||||||
|
filename = fileList[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( filename.isNull() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
qDebug() << "selected file path : " << filename.toUtf8();
|
||||||
|
|
||||||
|
FCEUI_printf ("WAV Recording movie to %s\n", filename.toStdString().c_str() );
|
||||||
|
|
||||||
|
fceuWrapperLock();
|
||||||
|
FCEUI_BeginWaveRecord( filename.toStdString().c_str() );
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void consoleWin_t::wavRecordStop(void)
|
||||||
|
{
|
||||||
|
if ( FCEUI_WaveRecordRunning() )
|
||||||
|
{
|
||||||
|
fceuWrapperLock();
|
||||||
|
FCEUI_EndWaveRecord();
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void consoleWin_t::aboutFCEUX(void)
|
void consoleWin_t::aboutFCEUX(void)
|
||||||
{
|
{
|
||||||
AboutWindow *aboutWin;
|
AboutWindow *aboutWin;
|
||||||
|
@ -3548,6 +3713,9 @@ void consoleWin_t::updatePeriodic(void)
|
||||||
recAviAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) );
|
recAviAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) );
|
||||||
recAsAviAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) );
|
recAsAviAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) );
|
||||||
stopAviAct->setEnabled( FCEU_IsValidUI( FCEUI_STOPAVI ) );
|
stopAviAct->setEnabled( FCEU_IsValidUI( FCEUI_STOPAVI ) );
|
||||||
|
recWavAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) && !FCEUI_WaveRecordRunning() );
|
||||||
|
recAsWavAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) && !FCEUI_WaveRecordRunning() );
|
||||||
|
stopWavAct->setEnabled( FCEUI_WaveRecordRunning() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( errorMsgValid )
|
if ( errorMsgValid )
|
||||||
|
|
|
@ -207,6 +207,9 @@ class consoleWin_t : public QMainWindow
|
||||||
QAction *recAviAct;
|
QAction *recAviAct;
|
||||||
QAction *recAsAviAct;
|
QAction *recAsAviAct;
|
||||||
QAction *stopAviAct;
|
QAction *stopAviAct;
|
||||||
|
QAction *recWavAct;
|
||||||
|
QAction *recAsWavAct;
|
||||||
|
QAction *stopWavAct;
|
||||||
|
|
||||||
QTimer *gameTimer;
|
QTimer *gameTimer;
|
||||||
|
|
||||||
|
@ -367,6 +370,9 @@ class consoleWin_t : public QMainWindow
|
||||||
void aviRecordStop(void);
|
void aviRecordStop(void);
|
||||||
void aviAudioEnableChange(bool);
|
void aviAudioEnableChange(bool);
|
||||||
void aviVideoFormatChanged(int idx);
|
void aviVideoFormatChanged(int idx);
|
||||||
|
void wavRecordStart(void);
|
||||||
|
void wavRecordAsStart(void);
|
||||||
|
void wavRecordStop(void);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -222,6 +222,15 @@ int getHotKeyConfig( int i, const char **nameOut, const char **keySeqOut, const
|
||||||
case HK_STOP_AVI:
|
case HK_STOP_AVI:
|
||||||
name = "StopAvi"; keySeq = "";
|
name = "StopAvi"; keySeq = "";
|
||||||
break;
|
break;
|
||||||
|
case HK_RECORD_WAV:
|
||||||
|
name = "RecordWav"; keySeq = "";
|
||||||
|
break;
|
||||||
|
case HK_RECORD_WAV_TO:
|
||||||
|
name = "RecordWavTo"; keySeq = "";
|
||||||
|
break;
|
||||||
|
case HK_STOP_WAV:
|
||||||
|
name = "StopWav"; keySeq = "";
|
||||||
|
break;
|
||||||
case HK_MUTE_CAPTURE:
|
case HK_MUTE_CAPTURE:
|
||||||
name = "MuteCapture"; keySeq = "'";
|
name = "MuteCapture"; keySeq = "'";
|
||||||
break;
|
break;
|
||||||
|
@ -344,7 +353,7 @@ LoadCPalette(const std::string &file)
|
||||||
static void
|
static void
|
||||||
CreateDirs(const std::string &dir)
|
CreateDirs(const std::string &dir)
|
||||||
{
|
{
|
||||||
const char *subs[]={"fcs","snaps","gameinfo","sav","cheats","avi", "movies","input", NULL };
|
const char *subs[]={"fcs","snaps","gameinfo","sav","cheats","avi","wav","movies","input", NULL };
|
||||||
std::string subdir;
|
std::string subdir;
|
||||||
int x=0;
|
int x=0;
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ enum HOTKEY {
|
||||||
HK_BIND_STATE, HK_MOVIE_TOGGLE_RW,
|
HK_BIND_STATE, HK_MOVIE_TOGGLE_RW,
|
||||||
HK_PLAY_MOVIE_FROM, HK_MOVIE_PLAY_RESTART, HK_RECORD_MOVIE_TO, HK_STOP_MOVIE,
|
HK_PLAY_MOVIE_FROM, HK_MOVIE_PLAY_RESTART, HK_RECORD_MOVIE_TO, HK_STOP_MOVIE,
|
||||||
HK_RECORD_AVI, HK_RECORD_AVI_TO, HK_STOP_AVI,
|
HK_RECORD_AVI, HK_RECORD_AVI_TO, HK_STOP_AVI,
|
||||||
|
HK_RECORD_WAV, HK_RECORD_WAV_TO, HK_STOP_WAV,
|
||||||
|
|
||||||
// Display
|
// Display
|
||||||
HK_TOGGLE_FG, HK_TOGGLE_BG, HK_TOGGLE_INPUT_DISPLAY, HK_LAG_COUNTER_DISPLAY,
|
HK_TOGGLE_FG, HK_TOGGLE_BG, HK_TOGGLE_INPUT_DISPLAY, HK_LAG_COUNTER_DISPLAY,
|
||||||
|
|
|
@ -124,3 +124,8 @@ bool FCEUI_BeginWaveRecord(const char *fn)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FCEUI_WaveRecordRunning(void)
|
||||||
|
{
|
||||||
|
return (soundlog != NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
bool FCEUI_BeginWaveRecord(const char *fn);
|
||||||
|
bool FCEUI_WaveRecordRunning(void);
|
||||||
void FCEU_WriteWaveData(int32 *Buffer, int Count);
|
void FCEU_WriteWaveData(int32 *Buffer, int Count);
|
||||||
int FCEUI_EndWaveRecord();
|
int FCEUI_EndWaveRecord(void);
|
||||||
|
|
Loading…
Reference in New Issue