# Preview is mapped to Scratch. It doesn't really feel right,
# but it's also unclear where else it would be.
preview: { note_number: 27 }
-preview_enabled: { note_number: 27 }
+preview_playing: { note_number: 27 }
+preview_ready: { note_number: 27 velocity: 2 }
# The slider (pitch bend) is mapped to master speed.
master_speed: { controller_number: 128 }
// Buttons.
optional MIDIButtonProto preview = 18;
optional int32 preview_bank = 19;
- optional MIDILightProto preview_enabled = 20;
+ optional MIDILightProto preview_playing = 41;
+ optional MIDILightProto preview_ready = 20;
optional MIDIButtonProto queue = 21;
optional int32 queue_bank = 22;
playlist_selection_changed(); // First time set-up.
preview_player.reset(new Player(ui->preview_display, Player::NO_STREAM_OUTPUT));
+ preview_player->set_done_callback([this] {
+ post_to_main_thread([this] {
+ preview_player_done();
+ });
+ });
+
live_player.reset(new Player(ui->live_display, Player::HTTPD_STREAM_OUTPUT));
live_player->set_done_callback([this] {
post_to_main_thread([this] {
QModelIndex index = selected->currentIndex();
const Clip &clip = *playlist_clips->clip(index.row());
preview_player->play(clip);
+ preview_playing = true;
+ enable_or_disable_preview_button();
return;
}
}
QItemSelectionModel *selected = ui->clip_list->selectionModel();
if (!selected->hasSelection()) {
preview_player->play(*cliplist_clips->back());
+ preview_playing = true;
+ enable_or_disable_preview_button();
return;
}
clip.stream_idx = ui->preview_display->get_stream_idx();
}
preview_player->play(clip);
+ preview_playing = true;
+ enable_or_disable_preview_button();
}
void MainWindow::preview_angle_clicked(unsigned stream_idx)
lock_blink_timeout->stop();
}
+void MainWindow::preview_player_done()
+{
+ preview_playing = false;
+ enable_or_disable_preview_button();
+}
+
void MainWindow::live_player_done()
{
playlist_clips->set_progress({});
QItemSelectionModel *selected = ui->playlist->selectionModel();
if (selected->hasSelection()) {
ui->preview_btn->setEnabled(true);
- midi_mapper.set_preview_enabled(true);
+ midi_mapper.set_preview_enabled(preview_playing ? MIDIMapper::On : MIDIMapper::Blinking);
return;
}
}
// TODO: Perhaps only enable this if something is actually selected.
ui->preview_btn->setEnabled(!cliplist_clips->empty());
- midi_mapper.set_preview_enabled(!cliplist_clips->empty());
+ if (preview_playing) {
+ midi_mapper.set_preview_enabled(MIDIMapper::On);
+ } else {
+ midi_mapper.set_preview_enabled(cliplist_clips->empty() ? MIDIMapper::Off : MIDIMapper::Blinking);
+ }
}
void MainWindow::enable_or_disable_queue_button()
QLabel *disk_free_label;
std::unique_ptr<Player> preview_player, live_player;
+ bool preview_playing = false;
DB db;
unsigned num_cameras;
void stop_clicked();
void speed_slider_changed(int percent);
void speed_lock_clicked();
+ void preview_player_done();
void live_player_done();
void live_player_clip_progress(const std::map<uint64_t, double> &progress, double time_remaining);
void set_output_status(const std::string &status);
if (current_controller_bank == 4) {
activate_mapped_light(*mapping_proto, MIDIMappingProto::kBank5IsSelectedFieldNumber, &active_lights);
}
- if (preview_enabled_light) {
- activate_mapped_light(*mapping_proto, MIDIMappingProto::kPreviewEnabledFieldNumber, &active_lights);
+ if (preview_enabled_light == On) { // Playing.
+ activate_mapped_light(*mapping_proto, MIDIMappingProto::kPreviewPlayingFieldNumber, &active_lights);
+ } else if (preview_enabled_light == Blinking) { // Preview ready.
+ activate_mapped_light(*mapping_proto, MIDIMappingProto::kPreviewReadyFieldNumber, &active_lights);
}
if (queue_enabled_light) {
activate_mapped_light(*mapping_proto, MIDIMappingProto::kQueueEnabledFieldNumber, &active_lights);
void refresh_lights();
- void set_preview_enabled(bool enabled) {
+ void set_preview_enabled(LightState enabled) {
preview_enabled_light = enabled;
refresh_lights();
}
int num_controller_banks; // Under <mu>.
std::atomic<int> current_controller_bank{0};
- std::atomic<bool> preview_enabled_light{false};
+ std::atomic<LightState> preview_enabled_light{Off};
std::atomic<bool> queue_enabled_light{false};
std::atomic<LightState> play_enabled_light{Off};
std::atomic<LightState> locked_light{On};