bool EventFilter::eventFilter(QObject *watched, QEvent *event) { Q_UNUSED(watched); AVPlayer *player = static_cast<AVPlayer*>(parent()); if (!player || !player->renderer() || !player->renderer()->widget()) return false; if (qobject_cast<QWidget*>(watched) != player->renderer()->widget()) { return false; } #ifndef QT_NO_DYNAMIC_CAST //dynamic_cast is defined as a macro to force a compile error if (player->renderer() != dynamic_cast<VideoRenderer*>(watched)) { // return false; } #endif QEvent::Type type = event->type(); switch (type) { case QEvent::KeyPress: { QKeyEvent *key_event = static_cast<QKeyEvent*>(event); int key = key_event->key(); Qt::KeyboardModifiers modifiers = key_event->modifiers(); switch (key) { case Qt::Key_C: //capture player->captureVideo(); break; case Qt::Key_N: //check playing? player->playNextFrame(); break; case Qt::Key_P: player->play(); break; case Qt::Key_Q: case Qt::Key_Escape: qApp->quit(); break; case Qt::Key_S: player->stop(); //check playing? break; case Qt::Key_Space: //check playing? qDebug("isPaused = %d", player->isPaused()); player->pause(!player->isPaused()); break; case Qt::Key_F: { //TODO: move to gui QWidget *w = qApp->activeWindow(); if (!w) return false; if (w->isFullScreen()) w->showNormal(); else w->showFullScreen(); } break; case Qt::Key_Up: { AudioOutput *ao = player->audio(); if (modifiers == Qt::ControlModifier) { qreal s = player->speed(); if (s < 1.4) s += 0.02; else s += 0.05; if (qAbs<qreal>(s-1.0) <= 0.01) s = 1.0; player->setSpeed(s); return true; } if (ao && ao->isAvailable()) { qreal v = player->audio()->volume(); if (v > 0.5) v += 0.1; else if (v > 0.1) v += 0.05; else v += 0.025; player->audio()->setVolume(v); qDebug("vol = %.3f", player->audio()->volume()); } } break; case Qt::Key_Down: { AudioOutput *ao = player->audio(); if (modifiers == Qt::ControlModifier) { qreal s = player->speed(); if (s < 1.4) s -= 0.02; else s -= 0.05; if (qAbs<qreal>(s-1.0) <= 0.01) s = 1.0; s = qMax<qreal>(s, 0.0); player->setSpeed(s); return true; } if (ao && ao->isAvailable()) { qreal v = player->audio()->volume(); if (v > 0.5) v -= 0.1; else if (v > 0.1) v -= 0.05; else v -= 0.025; player->audio()->setVolume(v); qDebug("vol = %.3f", player->audio()->volume()); } } break; case Qt::Key_O: { if (modifiers == Qt::ControlModifier) { //TODO: emit a signal so we can use custome dialogs? openLocalFile(); } else/* if (m == Qt::NoModifier) */{ //foreach renderer, or just current widget? add shortcuts for all vo? OSDFilter *osd = player->renderer()->osdFilter(); if (osd) osd->useNextShowType(); } } break; case Qt::Key_Left: qDebug("<-"); player->seekBackward(); break; case Qt::Key_Right: qDebug("->"); player->seekForward(); break; case Qt::Key_M: if (player->audio()) { player->audio()->setMute(!player->audio()->isMute()); } break; case Qt::Key_R: { VideoRenderer* renderer = player->renderer(); VideoRenderer::OutAspectRatioMode r = renderer->outAspectRatioMode(); renderer->setOutAspectRatioMode(VideoRenderer::OutAspectRatioMode(((int)r+1)%2)); } break; case Qt::Key_T: { QWidget *w = qApp->activeWindow(); if (!w) return false; Qt::WindowFlags wf = w->windowFlags(); if (wf & Qt::WindowStaysOnTopHint) { qDebug("Window not stays on top"); w->setWindowFlags(wf & ~Qt::WindowStaysOnTopHint); } else { qDebug("Window stays on top"); w->setWindowFlags(wf | Qt::WindowStaysOnTopHint); } //call setParent() when changing the flags, causing the widget to be hidden w->show(); } break; case Qt::Key_F1: help(); break; default: return false; } break; } case QEvent::DragEnter: case QEvent::DragMove: { QDropEvent *e = static_cast<QDropEvent*>(event); e->acceptProposedAction(); } break; case QEvent::Drop: { QDropEvent *e = static_cast<QDropEvent*>(event); QString path = e->mimeData()->urls().first().toLocalFile(); player->stop(); player->load(path); player->play(); e->acceptProposedAction(); } break; case QEvent::GraphicsSceneContextMenu: { QGraphicsSceneContextMenuEvent *e = static_cast<QGraphicsSceneContextMenuEvent*>(event); showMenu(e->screenPos()); } break; case QEvent::ContextMenu: { QContextMenuEvent *e = static_cast<QContextMenuEvent*>(event); showMenu(e->globalPos()); } break; default: return false; } return true; //false: for text input }
void init_audio_synth() { AudioOutput::Buffer buf; buf.dataSize = BUFFER_SIZE * CHANNEL_NUM * sizeof(int16_t); buf.data = (uint8_t *)&g_outBuf[0][0]; g_audioOut.add_buffer(&buf); buf.data = (uint8_t *)&g_outBuf[1][0]; g_audioOut.add_buffer(&buf); g_audioOut.set_source(&g_audioOutConverter); AudioBuffer audioBuf(&g_audioBuf[0], BUFFER_SIZE); g_audioOutConverter.set_buffer(audioBuf); g_audioOutConverter.set_source(&g_mixer); g_kickSeq.set_sample_rate(kSampleRate); g_kickSeq.set_tempo(100.0f); // g_kickSeq.set_sequence("x---x---x---x-x-x---x---x---x---xx--x--x--xxx-x-"); g_kickSeq.set_sequence("x---------x---------"); //x-x----xx---"); g_kickSeq.init(); g_kickGen.set_sample_rate(kSampleRate); g_kickGen.set_sequence(&g_kickSeq); g_kickGen.set_freq(50.0f); g_kickGen.enable_sustain(false); g_kickGen.init(); g_kickGen.set_attack(0.01f); g_kickGen.set_release(0.6f); g_bassSeq.set_sample_rate(kSampleRate); g_bassSeq.set_tempo(100.0f); g_bassSeq.set_sequence("--s>>>>p--------"); //"--s>>>p-----s>>>>>>p----"); g_bassSeq.init(); g_bassGen.set_sample_rate(kSampleRate); g_bassGen.set_sequence(&g_bassSeq); g_bassGen.set_freq(80.0f); g_bassGen.enable_sustain(true); g_bassGen.init(); g_bassGen.set_attack(0.3f); g_bassGen.set_release(3.0f); g_filter.set_sample_rate(kSampleRate); g_filter.set_frequency(120.0f); g_filter.set_q(0.4f); g_filter.recompute_coefficients(); g_filter.set_input(&g_bassGen); g_delay.set_sample_rate(kSampleRate); g_delay.set_maximum_delay_seconds(0.4f); g_delay.set_delay_samples(g_kickSeq.get_samples_per_beat()); g_delay.set_feedback(0.7f); g_delay.set_wet_mix(0.5f); g_delay.set_dry_mix(0.8f); g_delay.set_input(&g_kickGen); AudioBuffer mixBuf(&g_mixBuf[0], BUFFER_SIZE); g_mixer.set_buffer(mixBuf); g_mixer.set_input_count(2); g_mixer.set_input(0, &g_delay, 0.5f); g_mixer.set_input(1, &g_bassGen, 0.34f); // g_mixer.set_input(2, &g_tickGen, 0.3f); }