static gint record_timing (GtkWidget * widget, GdkEventKey * event) { if (event->keyval == GDK_Escape) { call_out_to_guile ("(if (defined? 'DenemoAudioAnnotateFinished) (DenemoAudioAnnotateFinished))"); stop_audio_playing (); } else { g_queue_push_tail (timings, GINT_TO_POINTER ((gint) (1000000 * get_playback_time ()))); call_out_to_guile ("(DenemoAudioAnnotate)"); } return TRUE; }
//these are event generated by a MIDI controller or Scheme script void handle_midi_event (gchar * buf) { //g_debug("%x : ready %d %x queue %d\n", midi_capture_on, divert_midi_event!=NULL, (0xFFFFFF & *(gint*)buf), g_queue_get_length(&midi_queue)); if (midi_capture_on && divert_midi_id == Denemo.project->id) { // this is only good for one endianness - FIXME ?? if (divert_midi_event) { *divert_midi_event = (0xFFFFFF & put_get_midiqueue (*(gint *) buf)); divert_midi_event = NULL; gtk_main_quit (); } else { put_midiqueue (*(gint *) buf); } return; //this *is* reached } if ((Denemo.project->midi_destination & MIDIRECORD) || (Denemo.project->midi_destination & (MIDIPLAYALONG | MIDICONDUCT))) { if (Denemo.project->midi_destination & MIDIRECORD) record_midi (buf, get_playback_time ()); if (Denemo.project->midi_destination & (MIDIPLAYALONG)) advance_until_time (buf);//FIXME is this thread-safe???? else play_adjusted_midi_event (buf);//play_midi_event (DEFAULT_BACKEND, 0, (guchar *) buf); } else { if ((Denemo.keyboard_state == (GDK_SHIFT_MASK | GDK_LOCK_MASK)) || Denemo.keyboard_state == (GDK_CONTROL_MASK) || Denemo.keyboard_state == (ADDING_MASK) || Denemo.keyboard_state == ((ADDING_MASK) | (CHORD_MASK)) || Denemo.keyboard_state == (GDK_CONTROL_MASK | GDK_LOCK_MASK) || (Denemo.keyboard_state == 0)) process_midi_event (buf); else if (Denemo.keyboard_state == (GDK_SHIFT_MASK) || Denemo.keyboard_state == (GDK_LOCK_MASK)) { play_adjusted_midi_event (buf); } } }
static int portaudio_start_playing () { playback_frame = seconds_to_nframes (get_playback_time ()); return 0; }
static void print_status(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; update_window_title(mpctx, false); update_vo_playback_state(mpctx); if (!opts->use_terminal) return; if (opts->quiet || !mpctx->playback_initialized || !mpctx->playing_msg_shown) { term_osd_set_status(mpctx, ""); return; } if (opts->status_msg) { char *r = mp_property_expand_escaped_string(mpctx, opts->status_msg); term_osd_set_status(mpctx, r); talloc_free(r); return; } char *line = NULL; // Playback status if (is_busy(mpctx)) { saddf(&line, "(...) "); } else if (mpctx->paused_for_cache && !opts->pause) { saddf(&line, "(Buffering) "); } else if (mpctx->paused) { saddf(&line, "(Paused) "); } if (mpctx->d_audio) saddf(&line, "A"); if (mpctx->d_video) saddf(&line, "V"); saddf(&line, ": "); // Playback position sadd_hhmmssff_u(&line, get_playback_time(mpctx), mpctx->opts->osd_fractions); double len = get_time_length(mpctx); if (len >= 0) { saddf(&line, " / "); sadd_hhmmssff(&line, len, mpctx->opts->osd_fractions); } sadd_percentage(&line, get_percent_pos(mpctx)); // other if (opts->playback_speed != 1) saddf(&line, " x%4.2f", opts->playback_speed); // A-V sync if (mpctx->d_audio && mpctx->d_video && mpctx->sync_audio_to_video) { saddf(&line, " A-V:%7.3f", mpctx->last_av_difference); if (fabs(mpctx->total_avsync_change) > 0.05) saddf(&line, " ct:%7.3f", mpctx->total_avsync_change); } #if HAVE_ENCODING double position = get_current_pos_ratio(mpctx, true); char lavcbuf[80]; if (encode_lavc_getstatus(mpctx->encode_lavc_ctx, lavcbuf, sizeof(lavcbuf), position) >= 0) { // encoding stats saddf(&line, " %s", lavcbuf); } else #endif { // VO stats if (mpctx->d_video) { if (mpctx->display_sync_active) { saddf(&line, " DS: %d/%"PRId64, mpctx->mistimed_frames_total, vo_get_delayed_count(mpctx->video_out)); } int64_t c = vo_get_drop_count(mpctx->video_out); if (c > 0 || mpctx->dropped_frames_total > 0) { saddf(&line, " Dropped: %"PRId64, c); if (mpctx->dropped_frames_total) saddf(&line, "/%d", mpctx->dropped_frames_total); } } } if (mpctx->demuxer) { int64_t fill = -1; demux_stream_control(mpctx->demuxer, STREAM_CTRL_GET_CACHE_FILL, &fill); if (fill >= 0) { saddf(&line, " Cache: "); struct demux_ctrl_reader_state s = {.ts_duration = -1}; demux_control(mpctx->demuxer, DEMUXER_CTRL_GET_READER_STATE, &s); if (s.ts_duration < 0) { saddf(&line, "???"); } else { saddf(&line, "%2ds", (int)s.ts_duration); } if (fill >= 1024 * 1024) { saddf(&line, "+%lldMB", (long long)(fill / 1024 / 1024)); } else { saddf(&line, "+%lldKB", (long long)(fill / 1024)); } } }