OSDN Git Service

[MOVIE_SAVER][PC8801][PC9801] Adjust sound frequency when OVERRIDE_48000Hz , still...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 15 Aug 2016 17:37:45 +0000 (02:37 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 15 Aug 2016 17:37:45 +0000 (02:37 +0900)
doc/Issues.ja.txt
source/src/qt/avio/movie_saver_audio.cpp
source/src/qt/common/menu_flags.cpp
source/src/qt/common/menu_flags.h
source/src/qt/common/qt_utils.cpp
source/src/qt/gui/CMakeLists.txt
source/src/qt/gui/mainwindow_utils.cpp
source/src/qt/gui/menu_sound.cpp
source/src/qt/gui/qt_glutil_gl2_0.h
source/src/qt/osd_sound.cpp
source/tool/installer_unix.sh

index a5ab9d2..371a7df 100644 (file)
 * PC-8801/9801シリーズ(+たぶんPC-8001SR)で、音声のサンプルレートを
  48000Hzとして動画をセーブすると、音がおかしくなる。
  → サンプルレート55600Hzで音声を出しているが、ffmpeg側は96000Hz
-   として録音をしてる。今後要改善。
+   として録音をしてる。今後要改善。→音程は治ったが、バタついてる(2016-08-16)
 
 * GNU/LinuxのFFMPEGが動かない!
  →FFMPEGをOpenCL有効でビルドしています。libOpenCLをインストールしてください。
 
 * 60fpsでの動画セーブをすると、フレームが不正確になる
- →原因を調べてます!
+ →原因を調べてます!→多分治りました(2016-08-15)
index 4a75ed9..2a56e58 100644 (file)
@@ -94,20 +94,30 @@ bool MOVIE_SAVER::open_audio(void)
                                                                           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");
@@ -158,8 +168,9 @@ void *MOVIE_SAVER::get_audio_frame()
                        //}
                }
        }
-       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
@@ -194,9 +205,14 @@ int MOVIE_SAVER::write_audio_frame()
        {
                /* 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
@@ -214,11 +230,13 @@ int MOVIE_SAVER::write_audio_frame()
                        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++;
        }
 
index 87a9f72..62e674a 100644 (file)
@@ -9,6 +9,16 @@ static const _TCHAR *sound_device_caption[] = {""};
 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;
@@ -448,7 +458,6 @@ USING_FLAGS::USING_FLAGS(config_t *cfg)
 #if defined(USE_STATE)
        use_state = true;
 #endif   
-
        p_config = cfg;
 }
 
@@ -506,3 +515,11 @@ config_t *USING_FLAGS::get_config_ptr(void)
 {
        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];
+}
+                                                                                                                                               
index 34e3ab9..76e99ce 100644 (file)
@@ -273,6 +273,7 @@ public:
        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);
index bd5e5d1..bd59ebc 100644 (file)
@@ -344,7 +344,8 @@ void Ui_MainWindow::LaunchEmuThread(void)
        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");
index 9492860..ff9622e 100644 (file)
@@ -145,8 +145,8 @@ target_link_libraries(CSPgui PUBLIC
          )
 
 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()
index fde9e7c..4e0cb4d 100644 (file)
@@ -15,9 +15,6 @@
 #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;
index cd00bb0..541c71c 100644 (file)
@@ -9,20 +9,14 @@
 #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);
@@ -119,14 +113,14 @@ void Ui_MainWindowBase::ConfigSoundMenu(void)
        
        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]);
        }
@@ -179,7 +173,7 @@ void Ui_MainWindowBase::retranslateSoundMenu(void)
        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);
        }
index c18fca2..bcbf0a0 100644 (file)
@@ -175,6 +175,6 @@ public slots:
        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
index 4d2b029..02eb181 100644 (file)
@@ -378,7 +378,7 @@ void OSD_BASE::stop_record_sound()
                        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);
                        
@@ -407,5 +407,5 @@ void OSD_BASE::restart_record_sound()
 
 int OSD_BASE::get_sound_rate()
 {
-       return sound_rate;
+       return snd_spec_presented.freq;
 }
index cdb04e5..ea0754a 100755 (executable)
@@ -7,7 +7,7 @@ LDCONFIG=/sbin/ldconfig
 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