diff --git a/panels/viewer.cpp b/panels/viewer.cpp index ceedf7cd6..232e83d86 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -41,6 +41,7 @@ Viewer::Viewer(QWidget *parent) : set_media(MEDIA_TYPE_SEQUENCE, NULL); ui->currentTimecode->setEnabled(false); + ui->currentTimecode->set_minimum_value(0); ui->currentTimecode->set_default_value(qSNaN()); ui->currentTimecode->set_value(0, false); ui->currentTimecode->set_display_type(LABELSLIDER_FRAMENUMBER); diff --git a/playback/audio.cpp b/playback/audio.cpp index 02ec65158..31cd6fecf 100644 --- a/playback/audio.cpp +++ b/playback/audio.cpp @@ -136,21 +136,29 @@ int AudioSenderThread::send_audio_to_output(int offset, int max) { int audio_ibuffer_limit = audio_ibuffer_read + actual_write; // send samples to audio monitor cache - if (sequence != NULL) { + // TODO make this work for the footage viewer + Sequence* s = NULL; + if (panel_footage_viewer->playing) { + s = panel_footage_viewer->seq; + } + if (panel_sequence_viewer->playing) { + s = panel_sequence_viewer->seq; + } + if (s != NULL) { if (panel_timeline->ui->audio_monitor->sample_cache_offset == -1) { - panel_timeline->ui->audio_monitor->sample_cache_offset = sequence->playhead; + panel_timeline->ui->audio_monitor->sample_cache_offset = s->playhead; } - int channel_count = av_get_channel_layout_nb_channels(sequence->audio_layout); + int channel_count = av_get_channel_layout_nb_channels(s->audio_layout); long sample_cache_playhead = panel_timeline->ui->audio_monitor->sample_cache_offset + (panel_timeline->ui->audio_monitor->sample_cache.size()/channel_count); int next_buffer_offset, buffer_offset_adjusted, i; - int buffer_offset = get_buffer_offset_from_frame(sequence, sample_cache_playhead); + int buffer_offset = get_buffer_offset_from_frame(s, sample_cache_playhead); if (samples.size() != channel_count) samples.resize(channel_count); samples.fill(0); // TODO: I don't like this, but i'm not sure if there's a smarter way to do it while (buffer_offset < audio_ibuffer_limit) { sample_cache_playhead++; - next_buffer_offset = qMin(get_buffer_offset_from_frame(sequence, sample_cache_playhead), audio_ibuffer_limit); + next_buffer_offset = qMin(get_buffer_offset_from_frame(s, sample_cache_playhead), audio_ibuffer_limit); while (buffer_offset < next_buffer_offset) { for (i=0;ivideo_tracks.size() > 0) source_fr = m->video_tracks.at(0)->video_frame_rate; default_clip_in = refactor_frame_number(m->in, source_fr, predicted_new_frame_rate); + default_clip_out = refactor_frame_number(m->out, source_fr, predicted_new_frame_rate); } break; case MEDIA_TYPE_SEQUENCE: s = get_sequence_from_tree(item); sequence_length = s->getEndFrame(); - if (sequence != NULL) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, sequence->frame_rate); + if (sequence != NULL) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, predicted_new_frame_rate); media = s; can_import = (s != sequence && sequence_length != 0); if (s->using_workarea) { default_clip_in = refactor_frame_number(s->workarea_in, s->frame_rate, predicted_new_frame_rate); + default_clip_out = refactor_frame_number(s->workarea_out, s->frame_rate, predicted_new_frame_rate); } break; default: @@ -315,7 +318,11 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { if (m->video_tracks.size() > 0 && m->video_tracks[0]->infinite_length && m->audio_tracks.size() == 0) { g.out = g.in + 100; } else { - g.out = entry_point + m->get_length_in_frames(predicted_new_frame_rate) - default_clip_in; + long length = m->get_length_in_frames(predicted_new_frame_rate); + g.out = entry_point + length - default_clip_in; + if (m->using_inout) { + g.out -= (length - default_clip_out); + } } for (int j=0;jaudio_tracks.size();j++) { @@ -332,7 +339,11 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { } break; case MEDIA_TYPE_SEQUENCE: - g.out = entry_point + sequence_length; + g.out = entry_point + sequence_length - default_clip_in; + + if (s->using_workarea) { + g.out -= (sequence_length - default_clip_out); + } g.track = -1; panel_timeline->ghosts.append(g);