/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2019-2020, William McPherson * Copyright (c) 2021, kleines Filmröllchen * Copyright (c) 2021, JJ Roberts-White * * SPDX-License-Identifier: BSD-2-Clause */ #include "AudioPlayerLoop.h" #include "MainWidget.h" #include "TrackManager.h" #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char** argv) { if (pledge("stdio thread rpath cpath wpath recvfd sendfd unix", nullptr) < 0) { perror("pledge"); return 1; } auto app = GUI::Application::construct(argc, argv); TrackManager track_manager; Audio::WavWriter wav_writer; Optional save_path; bool need_to_write_wav = false; auto audio_loop = AudioPlayerLoop::construct(track_manager, need_to_write_wav, wav_writer); audio_loop->enqueue_audio(); audio_loop->enqueue_audio(); auto app_icon = GUI::Icon::default_icon("app-piano"); auto window = GUI::Window::construct(); auto& main_widget = window->set_main_widget(track_manager, audio_loop); window->set_title("Piano"); window->resize(840, 600); window->set_icon(app_icon.bitmap_for_size(16)); auto main_widget_updater = Core::Timer::construct(static_cast((1 / 60.0) * 1000), [&] { Core::EventLoop::current().post_event(main_widget, make(0)); }); main_widget_updater->start(); auto& file_menu = window->add_menu("&File"); file_menu.add_action(GUI::Action::create("Export", { Mod_Ctrl, Key_E }, [&](const GUI::Action&) { save_path = GUI::FilePicker::get_save_filepath(window, "Untitled", "wav"); if (!save_path.has_value()) return; wav_writer.set_file(save_path.value()); if (wav_writer.has_error()) { GUI::MessageBox::show(window, String::formatted("Failed to export WAV file: {}", wav_writer.error_string()), "Error", GUI::MessageBox::Type::Error); wav_writer.clear_error(); return; } need_to_write_wav = true; })); file_menu.add_separator(); file_menu.add_action(GUI::CommonActions::make_quit_action([](auto&) { GUI::Application::the()->quit(); return; })); auto& edit_menu = window->add_menu("&Edit"); main_widget.add_actions(edit_menu); auto& help_menu = window->add_menu("&Help"); help_menu.add_action(GUI::CommonActions::make_about_action("Piano", app_icon, window)); window->show(); return app->exec(); }