* PC-8801/9801シリーズ(+たぶんPC-8001SR)で、音声のサンプルレートを
48000Hzとして動画をセーブすると、音がおかしくなる。
→ サンプルレート55600Hzで音声を出しているが、ffmpeg側は96000Hz
- として録音をしてる。今後要改善。
+ として録音をしてる。今後要改善。→音程は治ったが、バタついてる(2016-08-16)
* GNU/LinuxのFFMPEGが動かない!
→FFMPEGをOpenCL有効でビルドしています。libOpenCLをインストールしてください。
* 60fpsでの動画セーブをすると、フレームが不正確になる
- →原因を調べてます!
+ →原因を調べてます!→多分治りました(2016-08-15)
c->sample_rate, nb_samples);
/* create resampler context */
+#if 1
+ /* set options */
ost->swr_ctx = swr_alloc();
if (!ost->swr_ctx) {
AGAR_DebugLog(AGAR_LOG_INFO, "Could not allocate resampler context\n");
return false;
}
-
- /* set options */
av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0);
- av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0);
+ av_opt_set_int (ost->swr_ctx, "in_sample_rate", audio_sample_rate, 0);
av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0);
av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0);
av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
+#else
+ ost->swr_ctx = swr_alloc_set_opts(NULL,
+ AV_CH_LAYOUT_STEREO, c->sample_fmt, c->sample_rate,
+ AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, audio_sample_rate,
+ 0, NULL);
+ if (ost->swr_ctx == NULL) {
+ AGAR_DebugLog(AGAR_LOG_INFO, "Failed to initialize the resampling context\n");
+ return false;
+ }
+#endif
/* initialize the resampling context */
if ((ret = swr_init(ost->swr_ctx)) < 0) {
AGAR_DebugLog(AGAR_LOG_INFO, "Failed to initialize the resampling context\n");
//}
}
}
- frame->pts = ost->next_pts;
- ost->next_pts += frame->nb_samples;
+ frame->pts = av_rescale_rnd(ost->next_pts, audio_st.st->codec->sample_rate, audio_sample_rate, AV_ROUND_UP);
+ //frame->pts = ost->next_pts;
+ //ost->next_pts += frame->nb_samples;
return frame;
#else
{
/* convert samples from native format to destination codec format, using the resampler */
/* compute destination number of samples */
- dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame_src->nb_samples,
- c->sample_rate, c->sample_rate, AV_ROUND_UP);
- av_assert0(dst_nb_samples == frame_src->nb_samples);
+ dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, audio_sample_rate) + frame_src->nb_samples,
+ c->sample_rate, audio_sample_rate, AV_ROUND_UP);
+ //dst_nb_samples = av_rescale_rnd(frame_src->nb_samples,
+ // c->sample_rate, audio_sample_rate, AV_ROUND_UP);
+
+ //printf("IN %d Hz %d Samples OUT %d Hz %d Samples\n",
+ // audio_sample_rate, frame_src->nb_samples,
+ // c->sample_rate, dst_nb_samples);
/* when we pass a frame to the encoder, it may keep a reference to it
* internally;
* make sure we do not overwrite it here
AGAR_DebugLog(AGAR_LOG_INFO, "Error while converting\n");
return -1;
}
-
+
frame_dst = ost->frame;
+ frame_dst->nb_samples = dst_nb_samples;
frame_dst->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base);
ost->samples_count += dst_nb_samples;
+ ost->next_pts += dst_nb_samples;
totalAudioFrame++;
}
static const _TCHAR *joy_button_captions[] = {""};
#endif
+const int s_freq_table[8] = {
+ 2000, 4000, 8000, 11025, 22050, 44100,
+#ifdef OVERRIDE_SOUND_FREQ_48000HZ
+ OVERRIDE_SOUND_FREQ_48000HZ,
+#else
+ 48000,
+#endif
+ 96000,
+};
+
USING_FLAGS::USING_FLAGS(config_t *cfg)
{
p_osd = NULL;
#if defined(USE_STATE)
use_state = true;
#endif
-
p_config = cfg;
}
{
return p_config;
}
+
+int USING_FLAGS::get_s_freq_table(int num)
+{
+ if(num < 0) return s_freq_table[0];
+ if(num >= (sizeof(s_freq_table) / sizeof(int))) return s_freq_table[sizeof(int) / sizeof(s_freq_table) - 1];
+ return s_freq_table[num];
+}
+
bool is_machine_z80tvgame() { return machine_z80tvgame; }
const _TCHAR *get_joy_button_captions(int num);
const _TCHAR *get_sound_device_caption(int num);
+ int get_s_freq_table(int num);
void set_emu(EMU *p);
EMU *get_emu(void);
void set_osd(OSD *p);
connect(emu->get_osd(), SIGNAL(sig_enqueue_audio(int16_t*, int)), hSaveMovieThread, SLOT(enqueue_audio(int16_t *, int)));
connect(emu->get_osd(), SIGNAL(sig_enqueue_video(int, int, int, QImage *)),
hSaveMovieThread, SLOT(enqueue_video(int, int, int, QImage *)));
- connect(glv->extfunc, SIGNAL(sig_push_image_to_movie(QImage *)), hSaveMovieThread, SLOT(enqueue_video(QImage *)));
+ connect(glv->extfunc, SIGNAL(sig_push_image_to_movie(int, int, int, QImage *)),
+ hSaveMovieThread, SLOT(enqueue_video(int, int, int, QImage *)));
connect(this, SIGNAL(sig_quit_movie_thread()), hSaveMovieThread, SLOT(do_exit()));
objNameStr = QString("EmuMovieThread");
)
set_target_properties(CSPgui PROPERTIES
- SOVERSION 2.0.1
- VERSION 2.0.1
+ SOVERSION 2.0.2
+ VERSION 2.0.2
)
INSTALL(TARGETS CSPgui DESTINATION ${LIBCSP_INSTALL_DIR})
endif()
#include "qt_dialogs.h"
#include "agar_logger.h"
-extern const int s_freq_table[];
-extern const double s_late_table[];
-
void Ui_MainWindowBase::set_latency(int num)
{
if((num < 0) || (num >= 8)) return;
#include "mainwidget_base.h"
//#include "menuclasses.h"
#include "sound_dialog.h"
+#include "../common/menu_flags.h"
+
#include <QImageReader>
#include <QImage>
// WIP: Will move to another file
-const int s_freq_table[8] = {
- 2000, 4000, 8000, 11025, 22050, 44100,
-#ifdef OVERRIDE_SOUND_FREQ_48000HZ
- OVERRIDE_SOUND_FREQ_48000HZ,
-#else
- 48000,
-#endif
- 96000,
-};
const double s_late_table[5] = {0.05, 0.1, 0.2, 0.3, 0.4};
+extern USING_FLAGS *using_flags;
void Object_Menu_Control::on_set_freq(void) {
emit sig_freq(s_num);
for(i = 0; i < 8; i++) {
action_Freq[i] = new Action_Control(this, using_flags);
- tmps.setNum(s_freq_table[i]);
+ tmps.setNum(using_flags->get_s_freq_table(i));
tmps = QString::fromUtf8("action") + tmps + QString::fromUtf8("Hz");
action_Freq[i]->setObjectName(tmps);
action_Freq[i]->setCheckable(true);
action_Freq[i]->binds->setNumber(i);
if(i == using_flags->get_config_ptr()->sound_frequency) {
action_Freq[i]->setChecked(true);
- freq = s_freq_table[i];
+ freq = using_flags->get_s_freq_table(i);
}
actionGroup_Sound_Freq->addAction(action_Freq[i]);
}
if(using_flags->is_without_sound()) return;
for(i = 0; i < 8; i++) {
- tmps.setNum(s_freq_table[i]);
+ tmps.setNum(using_flags->get_s_freq_table(i));
tmps = tmps + QApplication::translate("MainWindow", "Hz", 0);
action_Freq[i]->setText(tmps);
}
void paintGL_OffScreen(int count, int w, int h);
signals:
- int sig_push_image_to_movie(QImage *);
+ int sig_push_image_to_movie(int, int, int, QImage *);
};
#endif // _QT_COMMON_GLUTIL_2_0_H
wav_header.format_id = EndianToLittle_WORD(1);
wav_header.channels = EndianToLittle_WORD(2);
wav_header.sample_bits = EndianToLittle_WORD(16);
- wav_header.sample_rate = EndianToLittle_DWORD(sound_rate);
+ wav_header.sample_rate = EndianToLittle_DWORD(snd_spec_presented.freq);
wav_header.block_size = EndianToLittle_WORD(wav_header.channels * wav_header.sample_bits / 8);
wav_header.data_speed = EndianToLittle_DWORD(wav_header.sample_rate * wav_header.block_size);
int OSD_BASE::get_sound_rate()
{
- return sound_rate;
+ return snd_spec_presented.freq;
}
CSP_ARCH="x86_64-linux-gnu"
MULTIARCH="Yes"
CSP_PREFIX=/usr/local
-CSP_GUILIB="libCSPgui.so.2.0.1 libCSPosd.so.2.2.0 libCSPemu_utils.so.2.0.0 libCSPavio.2.3.0"
+CSP_GUILIB="libCSPgui.so.2.0.2 libCSPosd.so.2.2.0 libCSPemu_utils.so.2.0.0 libCSPavio.2.3.0"
for i in "$@"; do
case "$1" in