aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authoroldmud0 <oldmud0@users.noreply.github.com>2020-07-31 16:17:05 -0500
committerGitHub <noreply@github.com>2020-07-31 16:17:05 -0500
commitec1c95bdb33dd063880c4cb6c3c9c3cf5d0ed454 (patch)
tree19e9217126837cac1ae3ab025b050bb3cfbda64b /include
parent8ea01d4c3139e27e84091c0b24266d9fb50ddf38 (diff)
parent36b5af3cb9ce8e5530c5bd9353a4e2f10da506b6 (diff)
Merge pull request #217 from AttorneyOnline/kfo-ao2
Final mega-merge with the Killing Fever Online client, along with other associated bugfixes and feature additions. This commit is release-ready.
Diffstat (limited to 'include')
-rw-r--r--include/aoapplication.h837
-rw-r--r--include/aoblipplayer.h7
-rw-r--r--include/aocaseannouncerdialog.h1
-rw-r--r--include/aocharmovie.h103
-rw-r--r--include/aoemotebutton.h11
-rw-r--r--include/aoevidencebutton.h11
-rw-r--r--include/aoevidencedisplay.h7
-rw-r--r--include/aoimage.h4
-rw-r--r--include/aolineedit.h9
-rw-r--r--include/aomovie.h3
-rw-r--r--include/aomusicplayer.h82
-rw-r--r--include/aooptionsdialog.h299
-rw-r--r--include/aoscene.h16
-rw-r--r--include/aosfxplayer.h23
-rw-r--r--include/aotextarea.h6
-rw-r--r--include/bass.h2444
-rw-r--r--include/bassopus.h64
-rw-r--r--include/chatlogpiece.h10
-rw-r--r--include/courtroom.h1549
-rw-r--r--include/datatypes.h6
-rw-r--r--include/discord_rich_presence.h1
-rw-r--r--include/lobby.h23
-rw-r--r--include/scrolltext.h47
23 files changed, 2940 insertions, 2623 deletions
diff --git a/include/aoapplication.h b/include/aoapplication.h
index 5646ddeb..f4685eca 100644
--- a/include/aoapplication.h
+++ b/include/aoapplication.h
@@ -1,383 +1,454 @@
-#ifndef AOAPPLICATION_H
-#define AOAPPLICATION_H
-
-#include "aopacket.h"
-#include "datatypes.h"
-#include "discord_rich_presence.h"
-
-#include <QApplication>
-#include <QFile>
-#include <QSettings>
-#include <QVector>
-
-#include <QDebug>
-#include <QDesktopWidget>
-#include <QRect>
-
-#include <QCryptographicHash>
-
-#include <QDir>
-#include <QStandardPaths>
-
-#include <QColor>
-#include <QScreen>
-#include <QStringList>
-#include <QTextStream>
-#ifdef QTAUDIO
-#include <QAudioDeviceInfo>
-#endif
-
-#include <QFuture>
-#include <QThread>
-#include <QThreadPool>
-#include <QtConcurrent/QtConcurrent>
-
-class NetworkManager;
-class Lobby;
-class Courtroom;
-class AOApplication : public QApplication {
- Q_OBJECT
-
-public:
- AOApplication(int &argc, char **argv);
- ~AOApplication();
-
- NetworkManager *net_manager;
- Lobby *w_lobby;
- Courtroom *w_courtroom;
- AttorneyOnline::Discord *discord;
-
- bool lobby_constructed = false;
- bool courtroom_constructed = false;
-
- void construct_lobby();
- void destruct_lobby();
-
- void construct_courtroom();
- void destruct_courtroom();
-
- bool is_music_track(QString trackname);
-
- void ms_packet_received(AOPacket *p_packet);
- void server_packet_received(AOPacket *p_packet);
-
- void send_ms_packet(AOPacket *p_packet);
- void send_server_packet(AOPacket *p_packet, bool encoded = true);
-
- void call_settings_menu();
- void call_announce_menu(Courtroom *court);
-
- /////////////////server metadata//////////////////
-
- unsigned int s_decryptor = 5;
- bool encryption_needed = true;
-
- bool yellow_text_enabled = false;
- bool prezoom_enabled = false;
- bool flipping_enabled = false;
- bool custom_objection_enabled = false;
- bool improved_loading_enabled = false;
- bool desk_mod_enabled = false;
- bool evidence_enabled = false;
- bool cccc_ic_support_enabled = false;
- bool arup_enabled = false;
- bool casing_alerts_enabled = false;
- bool modcall_reason_enabled = false;
- bool looping_sfx_support_enabled = false;
-
- ///////////////loading info///////////////////
-
- // player number, it's hardly used but might be needed for some old servers
- int s_pv = 0;
-
- QString server_software = "";
-
- int char_list_size = 0;
- int loaded_chars = 0;
- int generated_chars = 0;
- int evidence_list_size = 0;
- int loaded_evidence = 0;
- int music_list_size = 0;
- int loaded_music = 0;
- int area_count = 0;
- bool courtroom_loaded = false;
-
- //////////////////versioning///////////////
-
- int get_release() const { return RELEASE; }
- int get_major_version() const { return MAJOR_VERSION; }
- int get_minor_version() const { return MINOR_VERSION; }
- QString get_version_string();
-
- ///////////////////////////////////////////
-
- void set_favorite_list();
- QVector<server_type> &get_favorite_list() { return favorite_list; }
- void add_favorite_server(int p_server);
-
- void set_server_list();
- QVector<server_type> &get_server_list() { return server_list; }
-
- // reads the theme from config.ini and sets it accordingly
- void reload_theme();
-
- // Returns the character the player has currently selected
- QString get_current_char();
-
- // implementation in path_functions.cpp
- QString get_base_path();
- QString get_data_path();
- QString get_theme_path(QString p_file);
- QString get_default_theme_path(QString p_file);
- QString get_custom_theme_path(QString p_theme, QString p_file);
- QString get_character_path(QString p_char, QString p_file);
- QString get_sounds_path(QString p_file);
- QString get_music_path(QString p_song);
- QString get_background_path(QString p_file);
- QString get_default_background_path(QString p_file);
- QString get_evidence_path(QString p_file);
- QString get_case_sensitive_path(QString p_file);
-
- ////// Functions for reading and writing files //////
- // Implementations file_functions.cpp
-
- // Instead of reinventing the wheel, we'll use a QSettings class.
- QSettings *configini;
-
- // Reads the theme from config.ini and loads it into the current_theme
- // variable
- QString read_theme();
-
- // Returns the value of ooc_name in config.ini
- QString get_ooc_name();
-
- // Returns the blip rate from config.ini
- int read_blip_rate();
-
- // Returns true if blank blips is enabled in config.ini and false otherwise
- bool get_blank_blip();
-
- // Returns true if looping sound effects are enabled in the config.ini
- bool get_looping_sfx();
-
- // Returns true if kill music on object is enabled in the config.ini
- bool get_objectmusic();
-
- // Returns the value of default_music in config.ini
- int get_default_music();
-
- // Returns the value of default_sfx in config.ini
- int get_default_sfx();
-
- // Returns the value of default_blip in config.ini
- int get_default_blip();
-
- // Returns the value of whether Discord should be enabled on startup
- // from the config.ini.
- bool is_discord_enabled();
-
- // Returns the value of whether shaking and flashing should be enabled.
- // from the config.ini.
- bool is_shakeandflash_enabled();
-
- // Returns whether evidence should be maintained ic
- bool is_keepevi_enabled();
-
- // Returns the value of the maximum amount of lines the IC chatlog
- // may contain, from config.ini.
- int get_max_log_size();
-
- // Gets the punctuation delay modifier
- bool get_pundelay();
-
- //Gets whether slower text speed is enabled
- bool get_slower_blips();
- // Returns whether the log should go upwards (new behaviour)
- // or downwards (vanilla behaviour).
- bool get_log_goes_downwards();
-
- // Returns the username the user may have set in config.ini.
- QString get_default_username();
-
- // Returns the audio device used for the client.
- QString get_audio_output_device();
-#ifdef QTAUDIO
- QAudioDeviceInfo QtAudioDevice;
-#endif
-
- // Returns whether the user would like to have custom shownames on by default.
- bool get_showname_enabled_by_default();
-
- // Returns the list of words in callwords.ini
- QStringList get_call_words();
-
- // Appends the argument string to serverlist.txt
- void write_to_serverlist_txt(QString p_line);
-
- // Returns the contents of serverlist.txt
- QVector<server_type> read_serverlist_txt();
-
- // Returns the value of p_identifier in the design.ini file in p_design_path
- QString read_design_ini(QString p_identifier, QString p_design_path);
-
- // Returns the coordinates of widget with p_identifier from p_file
- QPoint get_button_spacing(QString p_identifier, QString p_file);
-
- // Returns the dimensions of widget with specified identifier from p_file
- pos_size_type get_element_dimensions(QString p_identifier, QString p_file);
-
- // Returns the name of the font with p_identifier from p_file
- QString get_font_name(QString p_identifier, QString p_file);
-
- // Returns the value of font_size with p_identifier from p_file
- int get_font_size(QString p_identifier, QString p_file);
-
- // Returns the color with p_identifier from p_file
- QColor get_color(QString p_identifier, QString p_file);
-
- // Returns the colour from the misc folder.
- QColor get_chat_color(QString p_identifier, QString p_chat);
-
- // Returns the sfx with p_identifier from sounds.ini in the current theme path
- QString get_sfx(QString p_identifier);
-
- // Figure out if we can opus this or if we should fall back to wav
- QString get_sfx_suffix(QString sound_to_check);
-
- // figure out if we can find what prefix this song uses
- QString get_music_prefix(QString song_to_check);
-
- // Can we use APNG for this? If not, WEBP? if not, GIF? If not, fall back to a
- // gif.
- QString get_image_suffix(QString path_to_check);
-
- // Returns the value of p_search_line within target_tag and terminator_tag
- QString read_char_ini(QString p_char, QString p_search_line,
- QString target_tag);
-
- // Returns the side of the p_char character from that characters ini file
- QString get_char_side(QString p_char);
-
- // Returns the showname from the ini of p_char
- QString get_showname(QString p_char);
-
- // Returns the value of chat from the specific p_char's ini file
- QString get_chat(QString p_char);
-
- // Returns the value of shouts from the specified p_char's ini file
- QString get_char_shouts(QString p_char);
-
- // Returns the preanim duration of p_char's p_emote
- int get_preanim_duration(QString p_char, QString p_emote);
-
- // Same as above, but only returns if it has a % in front(refer to Preanims
- // section in the manual)
- int get_ao2_preanim_duration(QString p_char, QString p_emote);
-
- // Not in use
- int get_text_delay(QString p_char, QString p_emote);
-
- // Returns the custom realisation used by the character.
- QString get_custom_realization(QString p_char);
-
- // Returns the name of p_char
- QString get_char_name(QString p_char);
-
- // Returns the total amount of emotes of p_char
- int get_emote_number(QString p_char);
-
- // Returns the emote comment of p_char's p_emote
- QString get_emote_comment(QString p_char, int p_emote);
-
- // Returns if an emote loops it's SFX
- QString get_sfx_looping(QString p_char, int p_emote);
-
- // Returns if an emote has a frame specific SFX for it
- QString get_frame_sfx_name(QString p_char, QString p_emote, int n_frame);
-
- // Returns if an emote has a frame specific SFX for it
- QString get_realization_frame(QString p_char, QString p_emote, int n_frame);
-
- // Returns if an emote has a frame specific SFX for it
- QString get_screenshake_frame(QString p_char, QString p_emote, int n_frame);
-
- // Returns the base name of p_char's p_emote
- QString get_emote(QString p_char, int p_emote);
-
- // Returns the preanimation name of p_char's p_emote
- QString get_pre_emote(QString p_char, int p_emote);
-
- // Returns the sfx of p_char's p_emote
- QString get_sfx_name(QString p_char, int p_emote);
-
- // Not in use
- int get_sfx_delay(QString p_char, int p_emote);
-
- // Returns the modifier for p_char's p_emote
- int get_emote_mod(QString p_char, int p_emote);
-
- // Returns the desk modifier for p_char's p_emote
- int get_desk_mod(QString p_char, int p_emote);
-
- // Returns p_char's gender
- QString get_gender(QString p_char);
-
- // ======
- // These are all casing-related settings.
- // ======
-
- // Returns if the user has casing alerts enabled.
- bool get_casing_enabled();
-
- // Returns if the user wants to get alerts for the defence role.
- bool get_casing_defence_enabled();
-
- // Same for prosecution.
- bool get_casing_prosecution_enabled();
-
- // Same for judge.
- bool get_casing_judge_enabled();
-
- // Same for witnesses.
- bool get_casing_wit_enabled();
-
- // Same for juror.
- bool get_casing_juror_enabled();
-
- // Same for steno.
- bool get_casing_steno_enabled();
-
- // Same for CM.
- bool get_casing_cm_enabled();
-
- // Get the message for the CM for casing alerts.
- QString get_casing_can_host_cases();
-
- // Get if html for ic log is enabled
- bool get_colored_iclog_enabled();
-
- // Get if ic log mirror is enabled
- bool get_iclmir_enabled();
-
- // Get if only inline coloring should be shown in log
- bool colorlog_restricted_enabled();
-
-private:
- const int RELEASE = 2;
- const int MAJOR_VERSION = 7;
- const int MINOR_VERSION = 0;
-
- QString current_theme = "default";
-
- QVector<server_type> server_list;
- QVector<server_type> favorite_list;
-
-private slots:
- void ms_connect_finished(bool connected, bool will_retry);
-
-public slots:
- void server_disconnected();
- void loading_cancelled();
-};
-
-#endif // AOAPPLICATION_H
+#ifndef AOAPPLICATION_H
+#define AOAPPLICATION_H
+
+#include "aopacket.h"
+#include "datatypes.h"
+#include "discord_rich_presence.h"
+
+#include <QApplication>
+#include <QFile>
+#include <QSettings>
+#include <QVector>
+
+#include <QDebug>
+#include <QDesktopWidget>
+#include <QRect>
+
+#include <QCryptographicHash>
+
+#include <QDir>
+#include <QStandardPaths>
+
+#include <QColor>
+#include <QScreen>
+#include <QStringList>
+#include <QTextStream>
+#ifdef QTAUDIO
+#include <QAudioDeviceInfo>
+#endif
+
+class NetworkManager;
+class Lobby;
+class Courtroom;
+
+class AOApplication : public QApplication {
+ Q_OBJECT
+
+public:
+ AOApplication(int &argc, char **argv);
+ ~AOApplication();
+
+ NetworkManager *net_manager;
+ Lobby *w_lobby;
+ Courtroom *w_courtroom;
+ AttorneyOnline::Discord *discord;
+
+ bool lobby_constructed = false;
+ bool courtroom_constructed = false;
+
+ void construct_lobby();
+ void destruct_lobby();
+
+ void construct_courtroom();
+ void destruct_courtroom();
+
+ void ms_packet_received(AOPacket *p_packet);
+ void server_packet_received(AOPacket *p_packet);
+
+ void send_ms_packet(AOPacket *p_packet);
+ void send_server_packet(AOPacket *p_packet, bool encoded = true);
+
+ void call_settings_menu();
+ void call_announce_menu(Courtroom *court);
+
+ /////////////////server metadata//////////////////
+
+ unsigned int s_decryptor = 5;
+ bool encryption_needed = true;
+
+ bool yellow_text_enabled = false;
+ bool prezoom_enabled = false;
+ bool flipping_enabled = false;
+ bool custom_objection_enabled = false;
+ bool improved_loading_enabled = false;
+ bool desk_mod_enabled = false;
+ bool evidence_enabled = false;
+ bool cccc_ic_support_enabled = false;
+ bool arup_enabled = false;
+ bool casing_alerts_enabled = false;
+ bool modcall_reason_enabled = false;
+ bool looping_sfx_support_enabled = false;
+ bool additive_enabled = false;
+ bool effects_enabled = false;
+
+ ///////////////loading info///////////////////
+
+ // player number, it's hardly used but might be needed for some old servers
+ int s_pv = 0;
+
+ QString server_software = "";
+
+ int char_list_size = 0;
+ int loaded_chars = 0;
+ int generated_chars = 0;
+ int evidence_list_size = 0;
+ int loaded_evidence = 0;
+ int music_list_size = 0;
+ int loaded_music = 0;
+
+ bool courtroom_loaded = false;
+
+ //////////////////versioning///////////////
+
+ int get_release() const { return RELEASE; }
+ int get_major_version() const { return MAJOR_VERSION; }
+ int get_minor_version() const { return MINOR_VERSION; }
+ QString get_version_string();
+
+ ///////////////////////////////////////////
+
+ void set_favorite_list();
+ QVector<server_type> &get_favorite_list() { return favorite_list; }
+ void add_favorite_server(int p_server);
+
+ void set_server_list();
+ QVector<server_type> &get_server_list() { return server_list; }
+
+ // reads the theme from config.ini and sets it accordingly
+ void reload_theme();
+
+ // Returns the character the player has currently selected
+ QString get_current_char();
+
+ // implementation in path_functions.cpp
+ QString get_base_path();
+ QString get_data_path();
+ QString get_theme_path(QString p_file);
+ QString get_default_theme_path(QString p_file);
+ QString get_custom_theme_path(QString p_theme, QString p_file);
+ QString get_character_path(QString p_char, QString p_file);
+ QString get_sounds_path(QString p_file);
+ QString get_music_path(QString p_song);
+ QString get_background_path(QString p_file);
+ QString get_default_background_path(QString p_file);
+ QString get_evidence_path(QString p_file);
+ QString get_case_sensitive_path(QString p_file);
+
+ ////// Functions for reading and writing files //////
+ // Implementations file_functions.cpp
+
+ // Instead of reinventing the wheel, we'll use a QSettings class.
+ QSettings *configini;
+
+ // Reads the theme from config.ini and loads it into the current_theme
+ // variable
+ QString read_theme();
+
+ // Returns the value of ooc_name in config.ini
+ QString get_ooc_name();
+
+ // Returns the blip rate from config.ini (once per X symbols)
+ int read_blip_rate();
+
+ // Returns true if blank blips is enabled in config.ini and false otherwise
+ bool get_blank_blip();
+
+ // Returns true if looping sound effects are enabled in the config.ini
+ bool get_looping_sfx();
+
+ // Returns true if stop music on objection is enabled in the config.ini
+ bool objection_stop_music();
+
+ // Returns the value of default_music in config.ini
+ int get_default_music();
+
+ // Returns the value of default_sfx in config.ini
+ int get_default_sfx();
+
+ // Returns the value of default_blip in config.ini
+ int get_default_blip();
+
+ // Returns the value of whether Discord should be enabled on startup
+ // from the config.ini.
+ bool is_discord_enabled();
+
+ // Returns the value of whether shaking should be enabled.
+ // from the config.ini.
+ bool is_shake_enabled();
+
+ // Returns the value of whether effects should be enabled.
+ // from the config.ini.
+ bool is_effects_enabled();
+
+ // Returns the value of whether frame-specific effects defined in char.ini
+ // should be sent/received over the network. from the config.ini.
+ bool is_frame_network_enabled();
+
+ // Returns the value of whether colored ic log should be a thing.
+ // from the config.ini.
+ bool is_colorlog_enabled();
+
+ // Returns the value of whether sticky sounds should be a thing.
+ // from the config.ini.
+ bool is_stickysounds_enabled();
+
+ // Returns the value of whether sticky effects should be a thing.
+ // from the config.ini.
+ bool is_stickyeffects_enabled();
+
+ // Returns the value of whether sticky preanims should be a thing.
+ // from the config.ini.
+ bool is_stickypres_enabled();
+
+ // Returns the value of whether custom chatboxes should be a thing.
+ // from the config.ini.
+ // I am increasingly maddened by the lack of dynamic auto-generation system for settings.
+ bool is_customchat_enabled();
+
+ // Returns the value of the maximum amount of lines the IC chatlog
+ // may contain, from config.ini.
+ int get_max_log_size();
+
+ // Returns whether the log should go upwards (new behaviour)
+ // or downwards (vanilla behaviour).
+ bool get_log_goes_downwards();
+
+ // Returns the username the user may have set in config.ini.
+ QString get_default_username();
+
+ // Returns the audio device used for the client.
+ QString get_audio_output_device();
+#ifdef QTAUDIO
+ QAudioDeviceInfo QtAudioDevice;
+#endif
+
+ // Returns whether the user would like to have custom shownames on by default.
+ bool get_showname_enabled_by_default();
+
+ // Returns the list of words in callwords.ini
+ QStringList get_call_words();
+
+ // returns all of the file's lines in a QStringList
+ QStringList get_list_file(QString p_file);
+
+ // Process a file and return its text as a QString
+ QString read_file(QString filename);
+
+ // Write text to file. make_dir would auto-create the directory if it doesn't
+ // exist.
+ bool write_to_file(QString p_text, QString p_file, bool make_dir = false);
+
+ // Append text to the end of the file. make_dir would auto-create the
+ // directory if it doesn't exist.
+ bool append_to_file(QString p_text, QString p_file, bool make_dir = false);
+
+ // Appends the argument string to serverlist.txt
+ void write_to_serverlist_txt(QString p_line);
+
+ // Returns the contents of serverlist.txt
+ QVector<server_type> read_serverlist_txt();
+
+ // Returns the value of p_identifier in the design.ini file in p_design_path
+ QString read_design_ini(QString p_identifier, QString p_design_path);
+
+ // Returns the coordinates of widget with p_identifier from p_file
+ QPoint get_button_spacing(QString p_identifier, QString p_file);
+
+ // Returns the dimensions of widget with specified identifier from p_file
+ pos_size_type get_element_dimensions(QString p_identifier, QString p_file,
+ QString p_char = "");
+
+ // Returns the value to you
+ QString get_design_element(QString p_identifier, QString p_file,
+ QString p_char = "");
+
+ // Returns the name of the font with p_identifier from p_file
+ QString get_font_name(QString p_identifier, QString p_file);
+
+ // Returns the value of font_size with p_identifier from p_file
+ int get_font_size(QString p_identifier, QString p_file);
+
+ // Returns the color with p_identifier from p_file
+ QColor get_color(QString p_identifier, QString p_file);
+
+ // Returns the markdown symbol used for specified p_identifier such as colors
+ QString get_chat_markdown(QString p_identifier, QString p_file);
+
+ // Returns the color from the misc folder.
+ QColor get_chat_color(QString p_identifier, QString p_chat);
+
+ // Returns the sfx with p_identifier from sounds.ini in the current theme path
+ QString get_sfx(QString p_identifier);
+
+ // Figure out if we can opus this or if we should fall back to wav
+ QString get_sfx_suffix(QString sound_to_check);
+
+ // Can we use APNG for this? If not, WEBP? If not, GIF? If not, fall back to
+ // PNG.
+ QString get_image_suffix(QString path_to_check);
+
+ // If this image is static and non-animated, return the supported static image
+ // formats. Currently only PNG.
+ QString get_static_image_suffix(QString path_to_check);
+
+ // Returns the value of p_search_line within target_tag and terminator_tag
+ QString read_char_ini(QString p_char, QString p_search_line,
+ QString target_tag);
+
+ // Returns a QStringList of all key=value definitions on a given tag.
+ QStringList read_ini_tags(QString p_file, QString target_tag = "");
+
+ // Sets the char.ini p_search_line key under tag target_tag to value.
+ void set_char_ini(QString p_char, QString value, QString p_search_line,
+ QString target_tag);
+
+ // Returns the text between target_tag and terminator_tag in p_file
+ QString get_stylesheet(QString p_file);
+
+ // Returns the text between target_tag and terminator_tag in p_file
+ QString get_tagged_stylesheet(QString target_tag, QString p_file);
+
+ // Returns the side of the p_char character from that characters ini file
+ QString get_char_side(QString p_char);
+
+ // Returns the showname from the ini of p_char
+ QString get_showname(QString p_char);
+
+ // Returns the value of chat image from the specific p_char's ini file
+ QString get_chat(QString p_char);
+
+ // Returns the value of chat font from the specific p_char's ini file
+ QString get_chat_font(QString p_char);
+
+ // Returns the value of chat font size from the specific p_char's ini file
+ int get_chat_size(QString p_char);
+
+ // Returns the value of shouts from the specified p_char's ini file
+ QString get_char_shouts(QString p_char);
+
+ // Returns the preanim duration of p_char's p_emote
+ int get_preanim_duration(QString p_char, QString p_emote);
+
+ // Same as above, but only returns if it has a % in front(refer to Preanims
+ // section in the manual)
+ int get_ao2_preanim_duration(QString p_char, QString p_emote);
+
+ // Not in use
+ int get_text_delay(QString p_char, QString p_emote);
+
+ // Get the effects folder referenced by the char.ini, read it and return the
+ // list of filenames in a string
+ QStringList get_theme_effects();
+
+ // Get the theme's effects folder, read it and return the list of filenames in
+ // a string
+ QStringList get_effects(QString p_char);
+
+ // t
+ QString get_effect(QString effect, QString p_char, QString p_folder);
+
+ // Return the effect sound associated with the fx_name in the
+ // misc/effects/<char-defined>/sounds.ini, or theme/effects/sounds.ini.
+ QString get_effect_sound(QString fx_name, QString p_char);
+
+ // Returns the custom realisation used by the character.
+ QString get_custom_realization(QString p_char);
+
+ // Returns the name of p_char
+ QString get_char_name(QString p_char);
+
+ // Returns the total amount of emotes of p_char
+ int get_emote_number(QString p_char);
+
+ // Returns the emote comment of p_char's p_emote
+ QString get_emote_comment(QString p_char, int p_emote);
+
+ // Returns the base name of p_char's p_emote
+ QString get_emote(QString p_char, int p_emote);
+
+ // Returns the preanimation name of p_char's p_emote
+ QString get_pre_emote(QString p_char, int p_emote);
+
+ // Returns the sfx of p_char's p_emote
+ QString get_sfx_name(QString p_char, int p_emote);
+
+ // Returns the blipsound of p_char's p_emote
+ QString get_emote_blip(QString p_char, int p_emote);
+
+ // Returns if the sfx is defined as looping in char.ini
+ QString get_sfx_looping(QString p_char, int p_emote);
+
+ // Returns if an emote has a frame specific SFX for it
+ QString get_sfx_frame(QString p_char, QString p_emote, int n_frame);
+
+ // Returns if an emote has a frame specific SFX for it
+ QString get_flash_frame(QString p_char, QString p_emote, int n_frame);
+
+ // Returns if an emote has a frame specific SFX for it
+ QString get_screenshake_frame(QString p_char, QString p_emote, int n_frame);
+
+ // Not in use
+ int get_sfx_delay(QString p_char, int p_emote);
+
+ // Returns the modifier for p_char's p_emote
+ int get_emote_mod(QString p_char, int p_emote);
+
+ // Returns the desk modifier for p_char's p_emote
+ int get_desk_mod(QString p_char, int p_emote);
+
+ // Returns p_char's gender
+ QString get_gender(QString p_char);
+
+ // ======
+ // These are all casing-related settings.
+ // ======
+
+ // Returns if the user has casing alerts enabled.
+ bool get_casing_enabled();
+
+ // Returns if the user wants to get alerts for the defence role.
+ bool get_casing_defence_enabled();
+
+ // Same for prosecution.
+ bool get_casing_prosecution_enabled();
+
+ // Same for judge.
+ bool get_casing_judge_enabled();
+
+ // Same for juror.
+ bool get_casing_juror_enabled();
+
+ // Same for steno.
+ bool get_casing_steno_enabled();
+
+ // Same for CM.
+ bool get_casing_cm_enabled();
+
+ // Get the message for the CM for casing alerts.
+ QString get_casing_can_host_cases();
+
+ // Get if automatic logging is enabled
+ bool get_auto_logging_enabled();
+
+ // The file name of the log file in base/logs.
+ QString log_filename;
+
+private:
+ const int RELEASE = 2;
+ const int MAJOR_VERSION = 8;
+ const int MINOR_VERSION = 4;
+
+ QString current_theme = "default";
+
+ QVector<server_type> server_list;
+ QVector<server_type> favorite_list;
+
+private slots:
+ void ms_connect_finished(bool connected, bool will_retry);
+
+public slots:
+ void server_disconnected();
+ void loading_cancelled();
+};
+
+#endif // AOAPPLICATION_H
diff --git a/include/aoblipplayer.h b/include/aoblipplayer.h
index 4520120e..5a104718 100644
--- a/include/aoblipplayer.h
+++ b/include/aoblipplayer.h
@@ -3,6 +3,7 @@
#if defined(BASSAUDIO)
#include "bass.h"
+#include "bassopus.h"
#elif defined(QTAUDIO)
#include <QSoundEffect>
#endif
@@ -10,6 +11,7 @@
#include "aoapplication.h"
#include <QDebug>
+#include <QElapsedTimer>
#include <QWidget>
#include <string.h>
@@ -19,14 +21,17 @@ public:
void set_blips(QString p_sfx);
void blip_tick();
- void set_volume(qreal p_volume);
+ void set_volume(int p_volume);
int m_cycle = 0;
private:
+ const int max_blip_ms = 60;
+
QWidget *m_parent;
AOApplication *ao_app;
qreal m_volume;
+ QElapsedTimer delay;
void set_volume_internal(qreal p_volume);
diff --git a/include/aocaseannouncerdialog.h b/include/aocaseannouncerdialog.h
index 89080def..0ac8f074 100644
--- a/include/aocaseannouncerdialog.h
+++ b/include/aocaseannouncerdialog.h
@@ -37,7 +37,6 @@ private:
QCheckBox *ui_judge_needed;
QCheckBox *ui_juror_needed;
QCheckBox *ui_steno_needed;
- QCheckBox *ui_witness_needed;
public slots:
void ok_pressed();
diff --git a/include/aocharmovie.h b/include/aocharmovie.h
index f62820b9..2dda0ec2 100644
--- a/include/aocharmovie.h
+++ b/include/aocharmovie.h
@@ -1,76 +1,125 @@
#ifndef AOCHARMOVIE_H
#define AOCHARMOVIE_H
-#include "include/aosfxplayer.h"
-#include "include/courtroom.h"
#include <QDebug>
+#include <QElapsedTimer>
#include <QImageReader>
#include <QLabel>
-#include <QMovie>
-#include <QPainter>
#include <QTimer>
class AOApplication;
+
class AOCharMovie : public QLabel {
Q_OBJECT
public:
AOCharMovie(QWidget *p_parent, AOApplication *p_ao_app);
- void play(QString p_char, QString p_emote, QString emote_prefix);
+ // Play a hat.gif - style preanimation
void play_pre(QString p_char, QString p_emote, int duration);
+
+ // Play a (b)normal.gif - style animation (talking)
void play_talking(QString p_char, QString p_emote);
+
+ // Play an (a)normal.gif - style animation (not talking)
void play_idle(QString p_char, QString p_emote);
- void set_flipped(bool p_flipped) { m_flipped = p_flipped; }
- void LoadImageWithStupidMethodForFlipSupport(QImage image);
+ // Stop the movie, clearing the image
void stop();
- void play_frame_sfx();
-
- void sfx_two_network_boogaloo();
- void screenshake_two_network_boogaloo();
- void realization_two_network_boogaloo();
+ // Set the m_flipped variable to true/false
+ void set_flipped(bool p_flipped) { m_flipped = p_flipped; }
- AOSfxPlayer *frame_specific_sfx_player;
- Courtroom *mycourtroom;
- QString frame_sfx_hellstring = "";
- QString frame_screenshake_hellstring = "";
- QString frame_realization_hellstring = "";
- bool use_networked_framehell = false;
+ // Set the movie's playback speed (between 10% and 1000%)
+ void set_speed(int modifier) { speed = qMax(10, qMin(modifier, 1000)); }
+ // Move the label itself around
void move(int ax, int ay);
+
+ // This is somewhat pointless now as there's no "QMovie" object to resize, aka
+ // no "combo" to speak of
void combo_resize(int w, int h);
+ // Return the frame delay adjusted for speed
+ int get_frame_delay(int delay);
+
+ QStringList network_strings;
+
+ QString m_char;
+ QString m_emote;
+
private:
AOApplication *ao_app;
- QMovie *m_movie;
- QVector<QImage> movie_frames;
+ QVector<QPixmap> movie_frames;
+ QVector<int> movie_delays;
+
+ // Effects such as sfx, screenshakes and realization flashes are stored in
+ // here. QString entry format: "sfx^[sfx_name]", "shake", "flash". The program
+ // uses the QVector index as reference.
+ QVector<QVector<QString>> movie_effects;
+
QTimer *preanim_timer;
QTimer *ticker;
QString last_path;
- QString current_emote;
- QString current_char;
- int default_w;
- int default_h;
+ QImageReader *m_reader = new QImageReader();
- const int time_mod = 62;
+ QElapsedTimer actual_time;
+
+ // Usually used to turn seconds into milliseconds such as for [Time] tag in
+ // char.ini
+ const int time_mod = 60;
// These are the X and Y values before they are fixed based on the sprite's
// width.
int x = 0;
int y = 0;
+ // These are the width and height values before they are fixed based on the
+ // sprite's width.
+ int f_w = 0;
+ int f_h = 0;
- bool m_flipped = false;
+ int frame = 0;
+ int max_frames = 0;
+
+ int speed = 100;
+ bool m_flipped = false;
bool play_once = true;
+ // Set the movie's image to provided paths, preparing for playback.
+ void load_image(QString p_char, QString p_emote, QString emote_prefix);
+
+ // Start playback of the movie (if animated).
+ void play();
+
+ // Play a frame-specific effect, if there's any defined for that specific
+ // frame.
+ void play_frame_effect(int frame);
+
+ // Retreive a pixmap adjused for mirroring/aspect ratio shenanigans from a
+ // provided QImage
+ QPixmap get_pixmap(QImage image);
+
+ // Set the movie's frame to provided pixmap
+ void set_frame(QPixmap f_pixmap);
+
+ // Initialize the frame-specific effects from the char.ini
+ void load_effects();
+
+ // Initialize the frame-specific effects from the provided network_strings,
+ // this is only initialized if network_strings has size more than 0.
+ void load_network_effects();
+
signals:
void done();
+ void shake();
+ void flash();
+ void play_sfx(QString sfx);
private slots:
- void timer_done();
+ void preanim_done();
void movie_ticker();
};
+
#endif // AOCHARMOVIE_H
diff --git a/include/aoemotebutton.h b/include/aoemotebutton.h
index acf0b484..58e7e747 100644
--- a/include/aoemotebutton.h
+++ b/include/aoemotebutton.h
@@ -2,7 +2,7 @@
#define AOEMOTEBUTTON_H
#include "aoapplication.h"
-
+#include <QPainter>
#include <QDebug>
#include <QPushButton>
@@ -10,11 +10,11 @@ class AOEmoteButton : public QPushButton {
Q_OBJECT
public:
- AOEmoteButton(QWidget *p_parent, AOApplication *p_ao_app, int p_x, int p_y);
+ AOEmoteButton(QWidget *p_parent, AOApplication *p_ao_app, int p_x, int p_y,
+ int p_w, int p_h);
- // void set_on(QString p_char, int p_emote);
- // void set_off(QString p_char, int p_emote);
- void set_image(QString p_char, int p_emote, QString suffix);
+ void set_image(QString p_image, QString p_emote_comment);
+ void set_char_image(QString p_char, int p_emote, QString suffix);
void set_id(int p_id) { m_id = p_id; }
int get_id() { return m_id; }
@@ -25,6 +25,7 @@ private:
int m_id = 0;
+
signals:
void emote_clicked(int p_id);
diff --git a/include/aoevidencebutton.h b/include/aoevidencebutton.h
index b56bfb1d..d7812fe9 100644
--- a/include/aoevidencebutton.h
+++ b/include/aoevidencebutton.h
@@ -12,10 +12,9 @@ class AOEvidenceButton : public QPushButton {
Q_OBJECT
public:
- AOEvidenceButton(QWidget *p_parent, AOApplication *p_ao_app, int p_x,
- int p_y);
+ AOEvidenceButton(QWidget *p_parent, AOApplication *p_ao_app, int p_x, int p_y,
+ int p_w, int p_h);
- void reset();
void set_image(QString p_image);
void set_theme_image(QString p_image);
void set_id(int p_id) { m_id = p_id; }
@@ -36,9 +35,9 @@ protected:
void leaveEvent(QEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
/*
- void dragLeaveEvent(QMouseEvent *e);
- void dragEnterEvent(QMouseEvent *e);
- */
+void dragLeaveEvent(QMouseEvent *e);
+void dragEnterEvent(QMouseEvent *e);
+*/
signals:
void evidence_clicked(int p_id);
diff --git a/include/aoevidencedisplay.h b/include/aoevidencedisplay.h
index 1d6280da..979a754e 100644
--- a/include/aoevidencedisplay.h
+++ b/include/aoevidencedisplay.h
@@ -2,11 +2,11 @@
#define AOEVIDENCEDISPLAY_H
#include "aoapplication.h"
+#include "aomovie.h"
#include "aosfxplayer.h"
#include <QDebug>
#include <QLabel>
-#include <QMovie>
class AOEvidenceDisplay : public QLabel {
Q_OBJECT
@@ -17,15 +17,16 @@ public:
void show_evidence(QString p_evidence_image, bool is_left_side, int p_volume);
QLabel *get_evidence_icon();
void reset();
+ void combo_resize(int w, int h);
private:
AOApplication *ao_app;
- QMovie *evidence_movie;
+ AOMovie *evidence_movie;
QLabel *evidence_icon;
AOSfxPlayer *sfx_player;
private slots:
- void frame_change(int p_frame);
+ void show_done();
};
#endif // AOEVIDENCEDISPLAY_H
diff --git a/include/aoimage.h b/include/aoimage.h
index c4fdf2ee..01ef8540 100644
--- a/include/aoimage.h
+++ b/include/aoimage.h
@@ -16,8 +16,8 @@ public:
QWidget *m_parent;
AOApplication *ao_app;
- void set_image(QString p_image);
- void set_image_from_path(QString p_path);
+ bool set_image(QString p_image);
+ bool set_chatbox(QString p_path);
void set_size_and_pos(QString identifier);
};
diff --git a/include/aolineedit.h b/include/aolineedit.h
index 70f1f978..5dce3aaa 100644
--- a/include/aolineedit.h
+++ b/include/aolineedit.h
@@ -10,14 +10,17 @@ class AOLineEdit : public QLineEdit {
public:
AOLineEdit(QWidget *parent);
+ void preserve_selection(bool toggle) { p_selection = toggle; }
+
+private:
+ bool p_selection = false;
+
protected:
void mouseDoubleClickEvent(QMouseEvent *e);
+ void focusOutEvent(QFocusEvent *ev);
signals:
void double_clicked();
-
-private slots:
- void on_enter_pressed();
};
#endif // AOLINEEDIT_H
diff --git a/include/aomovie.h b/include/aomovie.h
index caa1baa4..eb7f7a53 100644
--- a/include/aomovie.h
+++ b/include/aomovie.h
@@ -14,8 +14,7 @@ public:
AOMovie(QWidget *p_parent, AOApplication *p_ao_app);
void set_play_once(bool p_play_once);
- void start_timer(int delay);
- void play(QString p_gif, QString p_char = "", QString p_custom_theme = "",
+ void play(QString p_image, QString p_char = "", QString p_custom_theme = "",
int default_duration = 0);
void combo_resize(int w, int h);
void stop();
diff --git a/include/aomusicplayer.h b/include/aomusicplayer.h
index 5181630c..82751b68 100644
--- a/include/aomusicplayer.h
+++ b/include/aomusicplayer.h
@@ -1,8 +1,10 @@
#ifndef AOMUSICPLAYER_H
#define AOMUSICPLAYER_H
+#include "file_functions.h"
#if defined(BASSAUDIO)
#include "bass.h"
+#include "bassopus.h"
#elif defined(QTAUDIO)
#include <QMediaPlayer>
#endif
@@ -10,76 +12,44 @@
#include "aoapplication.h"
#include <QDebug>
-#include <QObject>
-#include <QTimer>
#include <QWidget>
#include <string.h>
-#if defined(BASSAUDIO)
-class AOMusicPlayer : public QObject {
- Q_OBJECT
+class AOMusicPlayer {
public:
AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
virtual ~AOMusicPlayer();
+ void set_volume(int p_value, int channel = -1);
+ void set_looping(bool toggle, int channel = 0);
- void play(QString p_song);
- void set_volume(int p_value);
-
- void kill_loop();
- QString get_path();
- bool enable_looping = true;
-
-private:
- QWidget *m_parent;
- AOApplication *ao_app;
-
- int m_volume = 0;
- QString f_path;
-
- HSTREAM m_stream;
-};
-#elif defined(QTAUDIO)
-class AOMusicPlayer : public QObject {
-public:
- AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
- ~AOMusicPlayer();
-
- void play(QString p_song);
- void set_volume(int p_value);
-
- void kill_loop();
- QString get_path();
- bool enable_looping = true;
-
-private:
- QWidget *m_parent;
- AOApplication *ao_app;
-
- QMediaPlayer m_player;
-
- int m_volume = 0;
- QString f_path;
-};
-#else
-class AOMusicPlayer : public QObject {
-public:
- AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
- ~AOMusicPlayer();
+ const int m_channelmax = 4;
- void play(QString p_song);
- void set_volume(int p_value);
+ // These have to be public for the stupid sync thing
+ int loop_start[4] = {0, 0, 0, 0};
+ int loop_end[4] = {0, 0, 0, 0};
- void kill_loop();
- QString get_path();
- bool enable_looping = true;
+public slots:
+ void play(QString p_song, int channel = 0, bool loop = false,
+ int effect_flags = 0);
+ void stop(int channel = 0);
private:
QWidget *m_parent;
AOApplication *ao_app;
- int m_volume = 0;
- QString f_path;
+ bool m_looping = false;
+ int m_volume[4] = {0, 0, 0, 0};
+
+ // Channel 0 = music
+ // Channel 1 = ambience
+ // Channel 2 = extra
+ // Channel 3 = extra
+ #if defined(BASSAUDIO)
+ HSTREAM m_stream_list[4];
+ HSYNC loop_sync[4];
+ #elif defined(QTAUDIO)
+ QMediaPlayer m_stream_list[4];
+ #endif
};
-#endif
#endif // AOMUSICPLAYER_H
diff --git a/include/aooptionsdialog.h b/include/aooptionsdialog.h
index 9a1429a4..2b8c879b 100644
--- a/include/aooptionsdialog.h
+++ b/include/aooptionsdialog.h
@@ -1,153 +1,146 @@
-#ifndef AOOPTIONSDIALOG_H
-#define AOOPTIONSDIALOG_H
-
-#include "aoapplication.h"
-
-#ifdef BASSAUDIO
-#include "bass.h"
-#elif defined QTAUDIO
-#include <QAudio>
-#include <QAudioDeviceInfo>
-#endif
-
-#include <QtCore/QVariant>
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QComboBox>
-#include <QtWidgets/QDialog>
-#include <QtWidgets/QDialogButtonBox>
-#include <QtWidgets/QFormLayout>
-#include <QtWidgets/QFrame>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QLineEdit>
-#include <QtWidgets/QPlainTextEdit>
-#include <QtWidgets/QSpinBox>
-#include <QtWidgets/QTabWidget>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QWidget>
-
-#include <QDirIterator>
-#include <QTextStream>
-
-class AOOptionsDialog : public QDialog {
- Q_OBJECT
-public:
- explicit AOOptionsDialog(QWidget *parent = nullptr,
- AOApplication *p_ao_app = nullptr);
-
-private:
- AOApplication *ao_app;
-
- QVBoxLayout *ui_vertical_layout;
- QTabWidget *ui_settings_tabs;
-
- QWidget *ui_gameplay_tab;
- QWidget *ui_form_layout_widget;
- QFormLayout *ui_gameplay_form;
- QLabel *ui_theme_label;
- QComboBox *ui_theme_combobox;
- QFrame *ui_theme_log_divider;
- QLabel *ui_downwards_lbl;
- QCheckBox *ui_downwards_cb;
- QLabel *ui_length_lbl;
- QSpinBox *ui_length_spinbox;
- QLabel *ui_pun_delay;
- QCheckBox *ui_pun_delay_cb;
- QLabel *ui_slower_blips_lb;
- QCheckBox *ui_slower_blips_cb;
- QLineEdit *ui_username_textbox;
- QLabel *ui_username_lbl;
- QLabel *ui_showname_lbl;
- QCheckBox *ui_showname_cb;
- QFrame *ui_net_divider;
- QLabel *ui_ms_lbl;
- QLineEdit *ui_ms_textbox;
- QLabel *ui_discord_lbl;
- QLabel *ui_epilepsy_lbl;
- QCheckBox *ui_epilepsy_cb;
-
- QCheckBox *ui_discord_cb;
- QLabel *ui_language_label;
- QComboBox *ui_language_combobox;
-
- QLabel *ui_keepevi_lbl;
- QCheckBox *ui_keepevi_cb;
-
- QLabel *ui_keepcobj_lbl;
- QCheckBox *ui_keepcobj_cb;
-
- QWidget *ui_callwords_tab;
- QWidget *ui_callwords_widget;
- QVBoxLayout *ui_callwords_layout;
- QPlainTextEdit *ui_callwords_textbox;
- QLabel *ui_callwords_explain_lbl;
- QCheckBox *ui_callwords_char_textbox;
-
- QWidget *ui_audio_tab;
- QWidget *ui_audio_widget;
- QFormLayout *ui_audio_layout;
- QLabel *ui_audio_device_lbl;
- QComboBox *ui_audio_device_combobox;
- QFrame *ui_audio_volume_divider;
- QSpinBox *ui_music_volume_spinbox;
- QLabel *ui_music_volume_lbl;
- QSpinBox *ui_sfx_volume_spinbox;
- QLabel *ui_loopsfx_lbl;
- QCheckBox *ui_loopsfx_cb;
- QLabel *ui_objectmusic_lbl;
- QCheckBox *ui_objectmusic_cb;
-
- QSpinBox *ui_blips_volume_spinbox;
- QLabel *ui_sfx_volume_lbl;
- QLabel *ui_blips_volume_lbl;
- QFrame *ui_volume_blip_divider;
- QSpinBox *ui_bliprate_spinbox;
- QLabel *ui_bliprate_lbl;
- QCheckBox *ui_blank_blips_cb;
- QLabel *ui_blank_blips_lbl;
- QDialogButtonBox *ui_settings_buttons;
-
- QWidget *ui_casing_tab;
- QWidget *ui_casing_widget;
- QFormLayout *ui_casing_layout;
- QLabel *ui_casing_supported_lbl;
- QLabel *ui_casing_enabled_lbl;
- QCheckBox *ui_casing_enabled_cb;
- QLabel *ui_casing_def_lbl;
- QCheckBox *ui_casing_def_cb;
- QLabel *ui_casing_pro_lbl;
- QCheckBox *ui_casing_pro_cb;
- QLabel *ui_casing_jud_lbl;
- QCheckBox *ui_casing_jud_cb;
- QLabel *ui_casing_jur_lbl;
- QCheckBox *ui_casing_jur_cb;
- QLabel *ui_casing_steno_lbl;
- QCheckBox *ui_casing_steno_cb;
- QLabel *ui_casing_cm_lbl;
- QCheckBox *ui_casing_cm_cb;
- QLabel *ui_casing_wit_lbl;
- QCheckBox *ui_casing_wit_cb;
- QLabel *ui_casing_cm_cases_lbl;
- QLineEdit *ui_casing_cm_cases_textbox;
-
- QWidget *ui_other_tab;
- QWidget *ui_other_widget;
- QFormLayout *ui_other_layout;
- QLabel *ui_other_fancy_icl_enabled_lb;
- QCheckBox *ui_other_fancy_icl_enabled_cb;
- QLabel *ui_other_mirror_icl_enabled_lb;
- QCheckBox *ui_other_mirror_icl_enabled_cb;
-
- QLabel *ui_other_fancy_icl_limit_lb;
- QCheckBox *ui_other_fancy_icl_limit_cb;
-
- bool needs_default_audiodev();
-
-signals:
-
-public slots:
- void save_pressed();
- void discard_pressed();
-};
-
-#endif // AOOPTIONSDIALOG_H
+#ifndef AOOPTIONSDIALOG_H
+#define AOOPTIONSDIALOG_H
+
+#include "aoapplication.h"
+#include "bass.h"
+
+#include <QtCore/QVariant>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QDialog>
+#include <QtWidgets/QDialogButtonBox>
+#include <QtWidgets/QFormLayout>
+#include <QtWidgets/QFrame>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QLineEdit>
+#include <QtWidgets/QPlainTextEdit>
+#include <QtWidgets/QScrollArea>
+#include <QtWidgets/QSpinBox>
+#include <QtWidgets/QTabWidget>
+#include <QtWidgets/QVBoxLayout>
+#include <QtWidgets/QWidget>
+
+#include <QDirIterator>
+#include <QTextStream>
+
+class AOOptionsDialog : public QDialog {
+ Q_OBJECT
+public:
+ explicit AOOptionsDialog(QWidget *parent = nullptr,
+ AOApplication *p_ao_app = nullptr);
+
+private:
+ AOApplication *ao_app;
+
+ QVBoxLayout *ui_vertical_layout;
+ QTabWidget *ui_settings_tabs;
+
+ QWidget *ui_gameplay_tab;
+ QWidget *ui_form_layout_widget;
+ QFormLayout *ui_gameplay_form;
+ QLabel *ui_theme_label;
+ QComboBox *ui_theme_combobox;
+ QFrame *ui_theme_log_divider;
+ QLabel *ui_downwards_lbl;
+ QCheckBox *ui_downwards_cb;
+ QLabel *ui_length_lbl;
+ QSpinBox *ui_length_spinbox;
+ QFrame *ui_log_names_divider;
+ QLineEdit *ui_username_textbox;
+ QLabel *ui_username_lbl;
+ QLabel *ui_showname_lbl;
+ QCheckBox *ui_showname_cb;
+ QFrame *ui_net_divider;
+ QLabel *ui_ms_lbl;
+ QLineEdit *ui_ms_textbox;
+ QLabel *ui_discord_lbl;
+ QCheckBox *ui_discord_cb;
+ QLabel *ui_language_label;
+ QComboBox *ui_language_combobox;
+
+ QLabel *ui_shake_lbl;
+ QCheckBox *ui_shake_cb;
+ QLabel *ui_effects_lbl;
+ QCheckBox *ui_effects_cb;
+ QLabel *ui_framenetwork_lbl;
+ QCheckBox *ui_framenetwork_cb;
+
+ QLabel *ui_colorlog_lbl;
+ QCheckBox *ui_colorlog_cb;
+
+ QLabel *ui_stickysounds_lbl;
+ QCheckBox *ui_stickysounds_cb;
+
+ QLabel *ui_stickyeffects_lbl;
+ QCheckBox *ui_stickyeffects_cb;
+
+ QLabel *ui_stickypres_lbl;
+ QCheckBox *ui_stickypres_cb;
+
+ QLabel *ui_customchat_lbl;
+ QCheckBox *ui_customchat_cb;
+
+ QWidget *ui_callwords_tab;
+ QWidget *ui_callwords_widget;
+ QVBoxLayout *ui_callwords_layout;
+ QPlainTextEdit *ui_callwords_textbox;
+ QLabel *ui_callwords_explain_lbl;
+ QCheckBox *ui_callwords_char_textbox;
+
+ QWidget *ui_audio_tab;
+ QWidget *ui_audio_widget;
+ QFormLayout *ui_audio_layout;
+ QLabel *ui_audio_device_lbl;
+ QComboBox *ui_audio_device_combobox;
+ QFrame *ui_audio_volume_divider;
+ QSpinBox *ui_music_volume_spinbox;
+ QLabel *ui_music_volume_lbl;
+ QSpinBox *ui_sfx_volume_spinbox;
+ QSpinBox *ui_blips_volume_spinbox;
+ QLabel *ui_sfx_volume_lbl;
+ QLabel *ui_blips_volume_lbl;
+ QFrame *ui_volume_blip_divider;
+ QSpinBox *ui_bliprate_spinbox;
+ QLabel *ui_bliprate_lbl;
+ QCheckBox *ui_blank_blips_cb;
+ QLabel *ui_blank_blips_lbl;
+ QLabel *ui_loopsfx_lbl;
+ QCheckBox *ui_loopsfx_cb;
+ QLabel *ui_objectmusic_lbl;
+ QCheckBox *ui_objectmusic_cb;
+ QDialogButtonBox *ui_settings_buttons;
+
+ QWidget *ui_casing_tab;
+ QWidget *ui_casing_widget;
+ QFormLayout *ui_casing_layout;
+ QLabel *ui_casing_supported_lbl;
+ QLabel *ui_casing_enabled_lbl;
+ QCheckBox *ui_casing_enabled_cb;
+ QLabel *ui_casing_def_lbl;
+ QCheckBox *ui_casing_def_cb;
+ QLabel *ui_casing_pro_lbl;
+ QCheckBox *ui_casing_pro_cb;
+ QLabel *ui_casing_jud_lbl;
+ QCheckBox *ui_casing_jud_cb;
+ QLabel *ui_casing_jur_lbl;
+ QCheckBox *ui_casing_jur_cb;
+ QLabel *ui_casing_steno_lbl;
+ QCheckBox *ui_casing_steno_cb;
+ QLabel *ui_casing_cm_lbl;
+ QCheckBox *ui_casing_cm_cb;
+ QLabel *ui_casing_cm_cases_lbl;
+ QLineEdit *ui_casing_cm_cases_textbox;
+ QLabel *ui_log_lbl;
+ QCheckBox *ui_log_cb;
+
+ bool needs_default_audiodev();
+
+signals:
+
+public slots:
+ void save_pressed();
+ void discard_pressed();
+};
+
+#endif // AOOPTIONSDIALOG_H
diff --git a/include/aoscene.h b/include/aoscene.h
index 7c1ef6fd..726e2641 100644
--- a/include/aoscene.h
+++ b/include/aoscene.h
@@ -16,11 +16,27 @@ public:
void set_image(QString p_image);
void set_legacy_desk(QString p_image);
+ // Move the label itself around
+ void move(int ax, int ay);
+
+ // This is somewhat pointless now as there's no "QMovie" object to resize, aka
+ // no "combo" to speak of
+ void combo_resize(int w, int h);
+
private:
QWidget *m_parent;
QMovie *m_movie;
AOApplication *ao_app;
QString last_image;
+
+ // These are the X and Y values before they are fixed based on the sprite's
+ // width.
+ int x = 0;
+ int y = 0;
+ // These are the width and height values before they are fixed based on the
+ // sprite's width.
+ int f_w = 0;
+ int f_h = 0;
};
#endif // AOSCENE_H
diff --git a/include/aosfxplayer.h b/include/aosfxplayer.h
index af3aef6d..99188719 100644
--- a/include/aosfxplayer.h
+++ b/include/aosfxplayer.h
@@ -3,6 +3,7 @@
#if defined(BASSAUDIO)
#include "bass.h"
+#include "bassopus.h"
#elif defined(QTAUDIO)
#include <QSoundEffect>
#endif
@@ -10,32 +11,36 @@
#include "aoapplication.h"
#include <QDebug>
-#include <QTimer>
#include <QWidget>
#include <string.h>
-class AOSfxPlayer : public QObject {
- Q_OBJECT
+class AOSfxPlayer {
public:
AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app);
- void play(QString p_sfx, QString p_char = "", QString shout = "");
- void stop();
+ void clear();
+ void loop_clear();
+ void play(QString p_sfx, QString p_char = "", QString shout = "",
+ int channel = -1);
+ void stop(int channel = -1);
void set_volume(qreal p_volume);
- void setLooping(bool is_looping);
+ void set_looping(bool toggle, int channel = -1);
+ int m_channel = 0;
private:
QWidget *m_parent;
AOApplication *ao_app;
qreal m_volume = 0;
- bool looping_sfx = false;
+ bool m_looping = true;
void set_volume_internal(qreal p_volume);
+ const int m_channelmax = 5;
+
#if defined(BASSAUDIO)
- HSTREAM m_stream;
+ HSTREAM m_stream_list[5];
#elif defined(QTAUDIO)
- QSoundEffect m_sfx;
+ QSoundEffect m_stream_list[5];
#endif
};
diff --git a/include/aotextarea.h b/include/aotextarea.h
index b8160890..453e9659 100644
--- a/include/aotextarea.h
+++ b/include/aotextarea.h
@@ -11,12 +11,12 @@ class AOTextArea : public QTextBrowser {
public:
AOTextArea(QWidget *p_parent = nullptr);
- void append_chatmessage(QString p_name, QString p_message, QString p_colour,
- bool song);
+ void append_linked(QString p_message);
+ void append_chatmessage(QString p_name, QString p_message, QString p_colur);
void append_error(QString p_message);
private:
- const QRegExp omnis_dank_url_regex = QRegExp("\\b(https?://\\S+\\.\\S+)\\b");
+ const QRegExp url_parser_regex = QRegExp("\\b(https?://\\S+\\.\\S+)\\b");
void auto_scroll(QTextCursor old_cursor, int scrollbar_value,
bool is_scrolled_down);
diff --git a/include/bass.h b/include/bass.h
index a3687b9f..ec2c7a29 100644
--- a/include/bass.h
+++ b/include/bass.h
@@ -1,1217 +1,1227 @@
-/*
- BASS 2.4 C/C++ header file
- Copyright (c) 1999-2018 Un4seen Developments Ltd.
-
- See the BASS.CHM file for more detailed documentation
-*/
-
-#ifndef BASS_H
-#define BASS_H
-
-#ifdef _WIN32
-#include <wtypes.h>
-typedef unsigned __int64 QWORD;
-#else
-#include <stdint.h>
-#define WINAPI
-#define CALLBACK
-typedef uint8_t BYTE;
-typedef uint16_t WORD;
-typedef uint32_t DWORD;
-typedef uint64_t QWORD;
-#ifndef __OBJC__
-typedef int BOOL;
-#endif
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-#define LOBYTE(a) (BYTE)(a)
-#define HIBYTE(a) (BYTE)((a) >> 8)
-#define LOWORD(a) (WORD)(a)
-#define HIWORD(a) (WORD)((a) >> 16)
-#define MAKEWORD(a, b) (WORD)(((a)&0xff) | ((b) << 8))
-#define MAKELONG(a, b) (DWORD)(((a)&0xffff) | ((b) << 16))
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define BASSVERSION 0x204 // API version
-#define BASSVERSIONTEXT "2.4"
-
-#ifndef BASSDEF
-#define BASSDEF(f) WINAPI f
-#else
-#define NOBASSOVERLOADS
-#endif
-
-typedef DWORD HMUSIC; // MOD music handle
-typedef DWORD HSAMPLE; // sample handle
-typedef DWORD HCHANNEL; // playing sample's channel handle
-typedef DWORD HSTREAM; // sample stream handle
-typedef DWORD HRECORD; // recording handle
-typedef DWORD HSYNC; // synchronizer handle
-typedef DWORD HDSP; // DSP handle
-typedef DWORD HFX; // DX8 effect handle
-typedef DWORD HPLUGIN; // Plugin handle
-
-// Error codes returned by BASS_ErrorGetCode
-#define BASS_OK 0 // all is OK
-#define BASS_ERROR_MEM 1 // memory error
-#define BASS_ERROR_FILEOPEN 2 // can't open the file
-#define BASS_ERROR_DRIVER 3 // can't find a free/valid driver
-#define BASS_ERROR_BUFLOST 4 // the sample buffer was lost
-#define BASS_ERROR_HANDLE 5 // invalid handle
-#define BASS_ERROR_FORMAT 6 // unsupported sample format
-#define BASS_ERROR_POSITION 7 // invalid position
-#define BASS_ERROR_INIT 8 // BASS_Init has not been successfully called
-#define BASS_ERROR_START 9 // BASS_Start has not been successfully called
-#define BASS_ERROR_SSL 10 // SSL/HTTPS support isn't available
-#define BASS_ERROR_ALREADY 14 // already initialized/paused/whatever
-#define BASS_ERROR_NOCHAN 18 // can't get a free channel
-#define BASS_ERROR_ILLTYPE 19 // an illegal type was specified
-#define BASS_ERROR_ILLPARAM 20 // an illegal parameter was specified
-#define BASS_ERROR_NO3D 21 // no 3D support
-#define BASS_ERROR_NOEAX 22 // no EAX support
-#define BASS_ERROR_DEVICE 23 // illegal device number
-#define BASS_ERROR_NOPLAY 24 // not playing
-#define BASS_ERROR_FREQ 25 // illegal sample rate
-#define BASS_ERROR_NOTFILE 27 // the stream is not a file stream
-#define BASS_ERROR_NOHW 29 // no hardware voices available
-#define BASS_ERROR_EMPTY 31 // the MOD music has no sequence data
-#define BASS_ERROR_NONET 32 // no internet connection could be opened
-#define BASS_ERROR_CREATE 33 // couldn't create the file
-#define BASS_ERROR_NOFX 34 // effects are not available
-#define BASS_ERROR_NOTAVAIL 37 // requested data/action is not available
-#define BASS_ERROR_DECODE 38 // the channel is/isn't a "decoding channel"
-#define BASS_ERROR_DX 39 // a sufficient DirectX version is not installed
-#define BASS_ERROR_TIMEOUT 40 // connection timedout
-#define BASS_ERROR_FILEFORM 41 // unsupported file format
-#define BASS_ERROR_SPEAKER 42 // unavailable speaker
-#define BASS_ERROR_VERSION 43 // invalid BASS version (used by add-ons)
-#define BASS_ERROR_CODEC 44 // codec is not available/supported
-#define BASS_ERROR_ENDED 45 // the channel/file has ended
-#define BASS_ERROR_BUSY 46 // the device is busy
-#define BASS_ERROR_UNKNOWN -1 // some other mystery problem
-
-// BASS_SetConfig options
-#define BASS_CONFIG_BUFFER 0
-#define BASS_CONFIG_UPDATEPERIOD 1
-#define BASS_CONFIG_GVOL_SAMPLE 4
-#define BASS_CONFIG_GVOL_STREAM 5
-#define BASS_CONFIG_GVOL_MUSIC 6
-#define BASS_CONFIG_CURVE_VOL 7
-#define BASS_CONFIG_CURVE_PAN 8
-#define BASS_CONFIG_FLOATDSP 9
-#define BASS_CONFIG_3DALGORITHM 10
-#define BASS_CONFIG_NET_TIMEOUT 11
-#define BASS_CONFIG_NET_BUFFER 12
-#define BASS_CONFIG_PAUSE_NOPLAY 13
-#define BASS_CONFIG_NET_PREBUF 15
-#define BASS_CONFIG_NET_PASSIVE 18
-#define BASS_CONFIG_REC_BUFFER 19
-#define BASS_CONFIG_NET_PLAYLIST 21
-#define BASS_CONFIG_MUSIC_VIRTUAL 22
-#define BASS_CONFIG_VERIFY 23
-#define BASS_CONFIG_UPDATETHREADS 24
-#define BASS_CONFIG_DEV_BUFFER 27
-#define BASS_CONFIG_VISTA_TRUEPOS 30
-#define BASS_CONFIG_IOS_MIXAUDIO 34
-#define BASS_CONFIG_DEV_DEFAULT 36
-#define BASS_CONFIG_NET_READTIMEOUT 37
-#define BASS_CONFIG_VISTA_SPEAKERS 38
-#define BASS_CONFIG_IOS_SPEAKER 39
-#define BASS_CONFIG_MF_DISABLE 40
-#define BASS_CONFIG_HANDLES 41
-#define BASS_CONFIG_UNICODE 42
-#define BASS_CONFIG_SRC 43
-#define BASS_CONFIG_SRC_SAMPLE 44
-#define BASS_CONFIG_ASYNCFILE_BUFFER 45
-#define BASS_CONFIG_OGG_PRESCAN 47
-#define BASS_CONFIG_MF_VIDEO 48
-#define BASS_CONFIG_AIRPLAY 49
-#define BASS_CONFIG_DEV_NONSTOP 50
-#define BASS_CONFIG_IOS_NOCATEGORY 51
-#define BASS_CONFIG_VERIFY_NET 52
-#define BASS_CONFIG_DEV_PERIOD 53
-#define BASS_CONFIG_FLOAT 54
-#define BASS_CONFIG_NET_SEEK 56
-#define BASS_CONFIG_AM_DISABLE 58
-#define BASS_CONFIG_NET_PLAYLIST_DEPTH 59
-#define BASS_CONFIG_NET_PREBUF_WAIT 60
-
-// BASS_SetConfigPtr options
-#define BASS_CONFIG_NET_AGENT 16
-#define BASS_CONFIG_NET_PROXY 17
-#define BASS_CONFIG_IOS_NOTIFY 46
-
-// BASS_Init flags
-#define BASS_DEVICE_8BITS 1 // 8 bit
-#define BASS_DEVICE_MONO 2 // mono
-#define BASS_DEVICE_3D 4 // enable 3D functionality
-#define BASS_DEVICE_16BITS 8 // limit output to 16 bit
-#define BASS_DEVICE_LATENCY 0x100 // calculate device latency (BASS_INFO struct)
-#define BASS_DEVICE_CPSPEAKERS \
- 0x400 // detect speakers via Windows control panel
-#define BASS_DEVICE_SPEAKERS 0x800 // force enabling of speaker assignment
-#define BASS_DEVICE_NOSPEAKER 0x1000 // ignore speaker arrangement
-#define BASS_DEVICE_DMIX 0x2000 // use ALSA "dmix" plugin
-#define BASS_DEVICE_FREQ 0x4000 // set device sample rate
-#define BASS_DEVICE_STEREO 0x8000 // limit output to stereo
-#define BASS_DEVICE_HOG 0x10000 // hog/exclusive mode
-#define BASS_DEVICE_AUDIOTRACK 0x20000 // use AudioTrack output
-#define BASS_DEVICE_DSOUND 0x40000 // use DirectSound output
-
-// DirectSound interfaces (for use with BASS_GetDSoundObject)
-#define BASS_OBJECT_DS 1 // IDirectSound
-#define BASS_OBJECT_DS3DL 2 // IDirectSound3DListener
-
-// Device info structure
-typedef struct {
-#if defined(_WIN32_WCE) || \
- (WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
- const wchar_t *name; // description
- const wchar_t *driver; // driver
-#else
- const char *name; // description
- const char *driver; // driver
-#endif
- DWORD flags;
-} BASS_DEVICEINFO;
-
-// BASS_DEVICEINFO flags
-#define BASS_DEVICE_ENABLED 1
-#define BASS_DEVICE_DEFAULT 2
-#define BASS_DEVICE_INIT 4
-#define BASS_DEVICE_LOOPBACK 8
-
-#define BASS_DEVICE_TYPE_MASK 0xff000000
-#define BASS_DEVICE_TYPE_NETWORK 0x01000000
-#define BASS_DEVICE_TYPE_SPEAKERS 0x02000000
-#define BASS_DEVICE_TYPE_LINE 0x03000000
-#define BASS_DEVICE_TYPE_HEADPHONES 0x04000000
-#define BASS_DEVICE_TYPE_MICROPHONE 0x05000000
-#define BASS_DEVICE_TYPE_HEADSET 0x06000000
-#define BASS_DEVICE_TYPE_HANDSET 0x07000000
-#define BASS_DEVICE_TYPE_DIGITAL 0x08000000
-#define BASS_DEVICE_TYPE_SPDIF 0x09000000
-#define BASS_DEVICE_TYPE_HDMI 0x0a000000
-#define BASS_DEVICE_TYPE_DISPLAYPORT 0x40000000
-
-// BASS_GetDeviceInfo flags
-#define BASS_DEVICES_AIRPLAY 0x1000000
-
-typedef struct {
- DWORD flags; // device capabilities (DSCAPS_xxx flags)
- DWORD hwsize; // size of total device hardware memory
- DWORD hwfree; // size of free device hardware memory
- DWORD freesam; // number of free sample slots in the hardware
- DWORD free3d; // number of free 3D sample slots in the hardware
- DWORD minrate; // min sample rate supported by the hardware
- DWORD maxrate; // max sample rate supported by the hardware
- BOOL
- eax; // device supports EAX? (always FALSE if BASS_DEVICE_3D was not used)
- DWORD minbuf; // recommended minimum buffer length in ms (requires
- // BASS_DEVICE_LATENCY)
- DWORD dsver; // DirectSound version
- DWORD latency; // delay (in ms) before start of playback (requires
- // BASS_DEVICE_LATENCY)
- DWORD initflags; // BASS_Init "flags" parameter
- DWORD speakers; // number of speakers available
- DWORD freq; // current output rate
-} BASS_INFO;
-
-// BASS_INFO flags (from DSOUND.H)
-#define DSCAPS_CONTINUOUSRATE \
- 0x00000010 // supports all sample rates between min/maxrate
-#define DSCAPS_EMULDRIVER \
- 0x00000020 // device does NOT have hardware DirectSound support
-#define DSCAPS_CERTIFIED \
- 0x00000040 // device driver has been certified by Microsoft
-#define DSCAPS_SECONDARYMONO 0x00000100 // mono
-#define DSCAPS_SECONDARYSTEREO 0x00000200 // stereo
-#define DSCAPS_SECONDARY8BIT 0x00000400 // 8 bit
-#define DSCAPS_SECONDARY16BIT 0x00000800 // 16 bit
-
-// Recording device info structure
-typedef struct {
- DWORD flags; // device capabilities (DSCCAPS_xxx flags)
- DWORD formats; // supported standard formats (WAVE_FORMAT_xxx flags)
- DWORD inputs; // number of inputs
- BOOL singlein; // TRUE = only 1 input can be set at a time
- DWORD freq; // current input rate
-} BASS_RECORDINFO;
-
-// BASS_RECORDINFO flags (from DSOUND.H)
-#define DSCCAPS_EMULDRIVER \
- DSCAPS_EMULDRIVER // device does NOT have hardware DirectSound recording
- // support
-#define DSCCAPS_CERTIFIED \
- DSCAPS_CERTIFIED // device driver has been certified by Microsoft
-
-// defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H)
-#ifndef WAVE_FORMAT_1M08
-#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */
-#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */
-#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */
-#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */
-#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */
-#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */
-#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */
-#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */
-#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */
-#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */
-#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */
-#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */
-#endif
-
-// Sample info structure
-typedef struct {
- DWORD freq; // default playback rate
- float volume; // default volume (0-1)
- float pan; // default pan (-1=left, 0=middle, 1=right)
- DWORD flags; // BASS_SAMPLE_xxx flags
- DWORD length; // length (in bytes)
- DWORD max; // maximum simultaneous playbacks
- DWORD origres; // original resolution
- DWORD chans; // number of channels
- DWORD mingap; // minimum gap (ms) between creating channels
- DWORD mode3d; // BASS_3DMODE_xxx mode
- float mindist; // minimum distance
- float maxdist; // maximum distance
- DWORD iangle; // angle of inside projection cone
- DWORD oangle; // angle of outside projection cone
- float outvol; // delta-volume outside the projection cone
- DWORD vam; // voice allocation/management flags (BASS_VAM_xxx)
- DWORD priority; // priority (0=lowest, 0xffffffff=highest)
-} BASS_SAMPLE;
-
-#define BASS_SAMPLE_8BITS 1 // 8 bit
-#define BASS_SAMPLE_FLOAT 256 // 32 bit floating-point
-#define BASS_SAMPLE_MONO 2 // mono
-#define BASS_SAMPLE_LOOP 4 // looped
-#define BASS_SAMPLE_3D 8 // 3D functionality
-#define BASS_SAMPLE_SOFTWARE 16 // not using hardware mixing
-#define BASS_SAMPLE_MUTEMAX 32 // mute at max distance (3D only)
-#define BASS_SAMPLE_VAM 64 // DX7 voice allocation & management
-#define BASS_SAMPLE_FX 128 // old implementation of DX8 effects
-#define BASS_SAMPLE_OVER_VOL 0x10000 // override lowest volume
-#define BASS_SAMPLE_OVER_POS 0x20000 // override longest playing
-#define BASS_SAMPLE_OVER_DIST \
- 0x30000 // override furthest from listener (3D only)
-
-#define BASS_STREAM_PRESCAN \
- 0x20000 // enable pin-point seeking/length (MP3/MP2/MP1)
-#define BASS_STREAM_AUTOFREE \
- 0x40000 // automatically free the stream when it stop/ends
-#define BASS_STREAM_RESTRATE \
- 0x80000 // restrict the download rate of internet file streams
-#define BASS_STREAM_BLOCK \
- 0x100000 // download/play internet file stream in small blocks
-#define BASS_STREAM_DECODE \
- 0x200000 // don't play the stream, only decode (BASS_ChannelGetData)
-#define BASS_STREAM_STATUS \
- 0x800000 // give server status info (HTTP/ICY tags) in DOWNLOADPROC
-
-#define BASS_MP3_IGNOREDELAY \
- 0x200 // ignore LAME/Xing/VBRI/iTunes delay & padding info
-#define BASS_MP3_SETPOS BASS_STREAM_PRESCAN
-
-#define BASS_MUSIC_FLOAT BASS_SAMPLE_FLOAT
-#define BASS_MUSIC_MONO BASS_SAMPLE_MONO
-#define BASS_MUSIC_LOOP BASS_SAMPLE_LOOP
-#define BASS_MUSIC_3D BASS_SAMPLE_3D
-#define BASS_MUSIC_FX BASS_SAMPLE_FX
-#define BASS_MUSIC_AUTOFREE BASS_STREAM_AUTOFREE
-#define BASS_MUSIC_DECODE BASS_STREAM_DECODE
-#define BASS_MUSIC_PRESCAN BASS_STREAM_PRESCAN // calculate playback length
-#define BASS_MUSIC_CALCLEN BASS_MUSIC_PRESCAN
-#define BASS_MUSIC_RAMP 0x200 // normal ramping
-#define BASS_MUSIC_RAMPS 0x400 // sensitive ramping
-#define BASS_MUSIC_SURROUND 0x800 // surround sound
-#define BASS_MUSIC_SURROUND2 0x1000 // surround sound (mode 2)
-#define BASS_MUSIC_FT2PAN 0x2000 // apply FastTracker 2 panning to XM files
-#define BASS_MUSIC_FT2MOD 0x2000 // play .MOD as FastTracker 2 does
-#define BASS_MUSIC_PT1MOD 0x4000 // play .MOD as ProTracker 1 does
-#define BASS_MUSIC_NONINTER 0x10000 // non-interpolated sample mixing
-#define BASS_MUSIC_SINCINTER 0x800000 // sinc interpolated sample mixing
-#define BASS_MUSIC_POSRESET 0x8000 // stop all notes when moving position
-#define BASS_MUSIC_POSRESETEX \
- 0x400000 // stop all notes and reset bmp/etc when moving position
-#define BASS_MUSIC_STOPBACK 0x80000 // stop the music on a backwards jump effect
-#define BASS_MUSIC_NOSAMPLE 0x100000 // don't load the samples
-
-// Speaker assignment flags
-#define BASS_SPEAKER_FRONT 0x1000000 // front speakers
-#define BASS_SPEAKER_REAR 0x2000000 // rear/side speakers
-#define BASS_SPEAKER_CENLFE 0x3000000 // center & LFE speakers (5.1)
-#define BASS_SPEAKER_REAR2 0x4000000 // rear center speakers (7.1)
-#define BASS_SPEAKER_N(n) ((n) << 24) // n'th pair of speakers (max 15)
-#define BASS_SPEAKER_LEFT 0x10000000 // modifier: left
-#define BASS_SPEAKER_RIGHT 0x20000000 // modifier: right
-#define BASS_SPEAKER_FRONTLEFT BASS_SPEAKER_FRONT | BASS_SPEAKER_LEFT
-#define BASS_SPEAKER_FRONTRIGHT BASS_SPEAKER_FRONT | BASS_SPEAKER_RIGHT
-#define BASS_SPEAKER_REARLEFT BASS_SPEAKER_REAR | BASS_SPEAKER_LEFT
-#define BASS_SPEAKER_REARRIGHT BASS_SPEAKER_REAR | BASS_SPEAKER_RIGHT
-#define BASS_SPEAKER_CENTER BASS_SPEAKER_CENLFE | BASS_SPEAKER_LEFT
-#define BASS_SPEAKER_LFE BASS_SPEAKER_CENLFE | BASS_SPEAKER_RIGHT
-#define BASS_SPEAKER_REAR2LEFT BASS_SPEAKER_REAR2 | BASS_SPEAKER_LEFT
-#define BASS_SPEAKER_REAR2RIGHT BASS_SPEAKER_REAR2 | BASS_SPEAKER_RIGHT
-
-#define BASS_ASYNCFILE 0x40000000
-#define BASS_UNICODE 0x80000000
-
-#define BASS_RECORD_PAUSE 0x8000 // start recording paused
-#define BASS_RECORD_ECHOCANCEL 0x2000
-#define BASS_RECORD_AGC 0x4000
-
-// DX7 voice allocation & management flags
-#define BASS_VAM_HARDWARE 1
-#define BASS_VAM_SOFTWARE 2
-#define BASS_VAM_TERM_TIME 4
-#define BASS_VAM_TERM_DIST 8
-#define BASS_VAM_TERM_PRIO 16
-
-// Channel info structure
-typedef struct {
- DWORD freq; // default playback rate
- DWORD chans; // channels
- DWORD flags; // BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags
- DWORD ctype; // type of channel
- DWORD origres; // original resolution
- HPLUGIN plugin; // plugin
- HSAMPLE sample; // sample
- const char *filename; // filename
-} BASS_CHANNELINFO;
-
-#define BASS_ORIGRES_FLOAT 0x10000
-
-// BASS_CHANNELINFO types
-#define BASS_CTYPE_SAMPLE 1
-#define BASS_CTYPE_RECORD 2
-#define BASS_CTYPE_STREAM 0x10000
-#define BASS_CTYPE_STREAM_OGG 0x10002
-#define BASS_CTYPE_STREAM_MP1 0x10003
-#define BASS_CTYPE_STREAM_MP2 0x10004
-#define BASS_CTYPE_STREAM_MP3 0x10005
-#define BASS_CTYPE_STREAM_AIFF 0x10006
-#define BASS_CTYPE_STREAM_CA 0x10007
-#define BASS_CTYPE_STREAM_MF 0x10008
-#define BASS_CTYPE_STREAM_AM 0x10009
-#define BASS_CTYPE_STREAM_DUMMY 0x18000
-#define BASS_CTYPE_STREAM_DEVICE 0x18001
-#define BASS_CTYPE_STREAM_WAV 0x40000 // WAVE flag, LOWORD=codec
-#define BASS_CTYPE_STREAM_WAV_PCM 0x50001
-#define BASS_CTYPE_STREAM_WAV_FLOAT 0x50003
-#define BASS_CTYPE_MUSIC_MOD 0x20000
-#define BASS_CTYPE_MUSIC_MTM 0x20001
-#define BASS_CTYPE_MUSIC_S3M 0x20002
-#define BASS_CTYPE_MUSIC_XM 0x20003
-#define BASS_CTYPE_MUSIC_IT 0x20004
-#define BASS_CTYPE_MUSIC_MO3 0x00100 // MO3 flag
-
-typedef struct {
- DWORD ctype; // channel type
-#if defined(_WIN32_WCE) || \
- (WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
- const wchar_t *name; // format description
- const wchar_t *exts; // file extension filter (*.ext1;*.ext2;etc...)
-#else
- const char *name; // format description
- const char *exts; // file extension filter (*.ext1;*.ext2;etc...)
-#endif
-} BASS_PLUGINFORM;
-
-typedef struct {
- DWORD version; // version (same form as BASS_GetVersion)
- DWORD formatc; // number of formats
- const BASS_PLUGINFORM *formats; // the array of formats
-} BASS_PLUGININFO;
-
-// 3D vector (for 3D positions/velocities/orientations)
-typedef struct BASS_3DVECTOR {
-#ifdef __cplusplus
- BASS_3DVECTOR(){};
- BASS_3DVECTOR(float _x, float _y, float _z) : x(_x), y(_y), z(_z){};
-#endif
- float x; // +=right, -=left
- float y; // +=up, -=down
- float z; // +=front, -=behind
-} BASS_3DVECTOR;
-
-// 3D channel modes
-#define BASS_3DMODE_NORMAL 0 // normal 3D processing
-#define BASS_3DMODE_RELATIVE 1 // position is relative to the listener
-#define BASS_3DMODE_OFF 2 // no 3D processing
-
-// software 3D mixing algorithms (used with BASS_CONFIG_3DALGORITHM)
-#define BASS_3DALG_DEFAULT 0
-#define BASS_3DALG_OFF 1
-#define BASS_3DALG_FULL 2
-#define BASS_3DALG_LIGHT 3
-
-// EAX environments, use with BASS_SetEAXParameters
-enum {
- EAX_ENVIRONMENT_GENERIC,
- EAX_ENVIRONMENT_PADDEDCELL,
- EAX_ENVIRONMENT_ROOM,
- EAX_ENVIRONMENT_BATHROOM,
- EAX_ENVIRONMENT_LIVINGROOM,
- EAX_ENVIRONMENT_STONEROOM,
- EAX_ENVIRONMENT_AUDITORIUM,
- EAX_ENVIRONMENT_CONCERTHALL,
- EAX_ENVIRONMENT_CAVE,
- EAX_ENVIRONMENT_ARENA,
- EAX_ENVIRONMENT_HANGAR,
- EAX_ENVIRONMENT_CARPETEDHALLWAY,
- EAX_ENVIRONMENT_HALLWAY,
- EAX_ENVIRONMENT_STONECORRIDOR,
- EAX_ENVIRONMENT_ALLEY,
- EAX_ENVIRONMENT_FOREST,
- EAX_ENVIRONMENT_CITY,
- EAX_ENVIRONMENT_MOUNTAINS,
- EAX_ENVIRONMENT_QUARRY,
- EAX_ENVIRONMENT_PLAIN,
- EAX_ENVIRONMENT_PARKINGLOT,
- EAX_ENVIRONMENT_SEWERPIPE,
- EAX_ENVIRONMENT_UNDERWATER,
- EAX_ENVIRONMENT_DRUGGED,
- EAX_ENVIRONMENT_DIZZY,
- EAX_ENVIRONMENT_PSYCHOTIC,
-
- EAX_ENVIRONMENT_COUNT // total number of environments
-};
-
-// EAX presets, usage: BASS_SetEAXParameters(EAX_PRESET_xxx)
-#define EAX_PRESET_GENERIC EAX_ENVIRONMENT_GENERIC, 0.5F, 1.493F, 0.5F
-#define EAX_PRESET_PADDEDCELL EAX_ENVIRONMENT_PADDEDCELL, 0.25F, 0.1F, 0.0F
-#define EAX_PRESET_ROOM EAX_ENVIRONMENT_ROOM, 0.417F, 0.4F, 0.666F
-#define EAX_PRESET_BATHROOM EAX_ENVIRONMENT_BATHROOM, 0.653F, 1.499F, 0.166F
-#define EAX_PRESET_LIVINGROOM EAX_ENVIRONMENT_LIVINGROOM, 0.208F, 0.478F, 0.0F
-#define EAX_PRESET_STONEROOM EAX_ENVIRONMENT_STONEROOM, 0.5F, 2.309F, 0.888F
-#define EAX_PRESET_AUDITORIUM EAX_ENVIRONMENT_AUDITORIUM, 0.403F, 4.279F, 0.5F
-#define EAX_PRESET_CONCERTHALL EAX_ENVIRONMENT_CONCERTHALL, 0.5F, 3.961F, 0.5F
-#define EAX_PRESET_CAVE EAX_ENVIRONMENT_CAVE, 0.5F, 2.886F, 1.304F
-#define EAX_PRESET_ARENA EAX_ENVIRONMENT_ARENA, 0.361F, 7.284F, 0.332F
-#define EAX_PRESET_HANGAR EAX_ENVIRONMENT_HANGAR, 0.5F, 10.0F, 0.3F
-#define EAX_PRESET_CARPETEDHALLWAY \
- EAX_ENVIRONMENT_CARPETEDHALLWAY, 0.153F, 0.259F, 2.0F
-#define EAX_PRESET_HALLWAY EAX_ENVIRONMENT_HALLWAY, 0.361F, 1.493F, 0.0F
-#define EAX_PRESET_STONECORRIDOR \
- EAX_ENVIRONMENT_STONECORRIDOR, 0.444F, 2.697F, 0.638F
-#define EAX_PRESET_ALLEY EAX_ENVIRONMENT_ALLEY, 0.25F, 1.752F, 0.776F
-#define EAX_PRESET_FOREST EAX_ENVIRONMENT_FOREST, 0.111F, 3.145F, 0.472F
-#define EAX_PRESET_CITY EAX_ENVIRONMENT_CITY, 0.111F, 2.767F, 0.224F
-#define EAX_PRESET_MOUNTAINS EAX_ENVIRONMENT_MOUNTAINS, 0.194F, 7.841F, 0.472F
-#define EAX_PRESET_QUARRY EAX_ENVIRONMENT_QUARRY, 1.0F, 1.499F, 0.5F
-#define EAX_PRESET_PLAIN EAX_ENVIRONMENT_PLAIN, 0.097F, 2.767F, 0.224F
-#define EAX_PRESET_PARKINGLOT EAX_ENVIRONMENT_PARKINGLOT, 0.208F, 1.652F, 1.5F
-#define EAX_PRESET_SEWERPIPE EAX_ENVIRONMENT_SEWERPIPE, 0.652F, 2.886F, 0.25F
-#define EAX_PRESET_UNDERWATER EAX_ENVIRONMENT_UNDERWATER, 1.0F, 1.499F, 0.0F
-#define EAX_PRESET_DRUGGED EAX_ENVIRONMENT_DRUGGED, 0.875F, 8.392F, 1.388F
-#define EAX_PRESET_DIZZY EAX_ENVIRONMENT_DIZZY, 0.139F, 17.234F, 0.666F
-#define EAX_PRESET_PSYCHOTIC EAX_ENVIRONMENT_PSYCHOTIC, 0.486F, 7.563F, 0.806F
-
-typedef DWORD(CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length,
- void *user);
-/* User stream callback function. NOTE: A stream function should obviously be as
-quick as possible, other streams (and MOD musics) can't be mixed until it's
-finished. handle : The stream that needs writing buffer : Buffer to write the
-samples in length : Number of bytes to write user : The 'user' parameter value
-given when calling BASS_StreamCreate RETURN : Number of bytes written. Set the
-BASS_STREAMPROC_END flag to end the stream. */
-
-#define BASS_STREAMPROC_END 0x80000000 // end of user stream flag
-
-// special STREAMPROCs
-#define STREAMPROC_DUMMY (STREAMPROC *)0 // "dummy" stream
-#define STREAMPROC_PUSH (STREAMPROC *)-1 // push stream
-#define STREAMPROC_DEVICE (STREAMPROC *)-2 // device mix stream
-
-// BASS_StreamCreateFileUser file systems
-#define STREAMFILE_NOBUFFER 0
-#define STREAMFILE_BUFFER 1
-#define STREAMFILE_BUFFERPUSH 2
-
-// User file stream callback functions
-typedef void(CALLBACK FILECLOSEPROC)(void *user);
-typedef QWORD(CALLBACK FILELENPROC)(void *user);
-typedef DWORD(CALLBACK FILEREADPROC)(void *buffer, DWORD length, void *user);
-typedef BOOL(CALLBACK FILESEEKPROC)(QWORD offset, void *user);
-
-typedef struct {
- FILECLOSEPROC *close;
- FILELENPROC *length;
- FILEREADPROC *read;
- FILESEEKPROC *seek;
-} BASS_FILEPROCS;
-
-// BASS_StreamPutFileData options
-#define BASS_FILEDATA_END 0 // end & close the file
-
-// BASS_StreamGetFilePosition modes
-#define BASS_FILEPOS_CURRENT 0
-#define BASS_FILEPOS_DECODE BASS_FILEPOS_CURRENT
-#define BASS_FILEPOS_DOWNLOAD 1
-#define BASS_FILEPOS_END 2
-#define BASS_FILEPOS_START 3
-#define BASS_FILEPOS_CONNECTED 4
-#define BASS_FILEPOS_BUFFER 5
-#define BASS_FILEPOS_SOCKET 6
-#define BASS_FILEPOS_ASYNCBUF 7
-#define BASS_FILEPOS_SIZE 8
-#define BASS_FILEPOS_BUFFERING 9
-
-typedef void(CALLBACK DOWNLOADPROC)(const void *buffer, DWORD length,
- void *user);
-/* Internet stream download callback function.
-buffer : Buffer containing the downloaded data... NULL=end of download
-length : Number of bytes in the buffer
-user : The 'user' parameter value given when calling BASS_StreamCreateURL */
-
-// BASS_ChannelSetSync types
-#define BASS_SYNC_POS 0
-#define BASS_SYNC_END 2
-#define BASS_SYNC_META 4
-#define BASS_SYNC_SLIDE 5
-#define BASS_SYNC_STALL 6
-#define BASS_SYNC_DOWNLOAD 7
-#define BASS_SYNC_FREE 8
-#define BASS_SYNC_SETPOS 11
-#define BASS_SYNC_MUSICPOS 10
-#define BASS_SYNC_MUSICINST 1
-#define BASS_SYNC_MUSICFX 3
-#define BASS_SYNC_OGG_CHANGE 12
-#define BASS_SYNC_MIXTIME 0x40000000 // flag: sync at mixtime, else at playtime
-#define BASS_SYNC_ONETIME 0x80000000 // flag: sync only once, else continuously
-
-typedef void(CALLBACK SYNCPROC)(HSYNC handle, DWORD channel, DWORD data,
- void *user);
-/* Sync callback function. NOTE: a sync callback function should be very
-quick as other syncs can't be processed until it has finished. If the sync
-is a "mixtime" sync, then other streams and MOD musics can't be mixed until
-it's finished either.
-handle : The sync that has occured
-channel: Channel that the sync occured in
-data : Additional data associated with the sync's occurance
-user : The 'user' parameter given when calling BASS_ChannelSetSync */
-
-typedef void(CALLBACK DSPPROC)(HDSP handle, DWORD channel, void *buffer,
- DWORD length, void *user);
-/* DSP callback function. NOTE: A DSP function should obviously be as quick as
-possible... other DSP functions, streams and MOD musics can not be processed
-until it's finished.
-handle : The DSP handle
-channel: Channel that the DSP is being applied to
-buffer : Buffer to apply the DSP to
-length : Number of bytes in the buffer
-user : The 'user' parameter given when calling BASS_ChannelSetDSP */
-
-typedef BOOL(CALLBACK RECORDPROC)(HRECORD handle, const void *buffer,
- DWORD length, void *user);
-/* Recording callback function.
-handle : The recording handle
-buffer : Buffer containing the recorded sample data
-length : Number of bytes
-user : The 'user' parameter value given when calling BASS_RecordStart
-RETURN : TRUE = continue recording, FALSE = stop */
-
-// BASS_ChannelIsActive return values
-#define BASS_ACTIVE_STOPPED 0
-#define BASS_ACTIVE_PLAYING 1
-#define BASS_ACTIVE_STALLED 2
-#define BASS_ACTIVE_PAUSED 3
-
-// Channel attributes
-#define BASS_ATTRIB_FREQ 1
-#define BASS_ATTRIB_VOL 2
-#define BASS_ATTRIB_PAN 3
-#define BASS_ATTRIB_EAXMIX 4
-#define BASS_ATTRIB_NOBUFFER 5
-#define BASS_ATTRIB_VBR 6
-#define BASS_ATTRIB_CPU 7
-#define BASS_ATTRIB_SRC 8
-#define BASS_ATTRIB_NET_RESUME 9
-#define BASS_ATTRIB_SCANINFO 10
-#define BASS_ATTRIB_NORAMP 11
-#define BASS_ATTRIB_BITRATE 12
-#define BASS_ATTRIB_BUFFER 13
-#define BASS_ATTRIB_MUSIC_AMPLIFY 0x100
-#define BASS_ATTRIB_MUSIC_PANSEP 0x101
-#define BASS_ATTRIB_MUSIC_PSCALER 0x102
-#define BASS_ATTRIB_MUSIC_BPM 0x103
-#define BASS_ATTRIB_MUSIC_SPEED 0x104
-#define BASS_ATTRIB_MUSIC_VOL_GLOBAL 0x105
-#define BASS_ATTRIB_MUSIC_ACTIVE 0x106
-#define BASS_ATTRIB_MUSIC_VOL_CHAN 0x200 // + channel #
-#define BASS_ATTRIB_MUSIC_VOL_INST 0x300 // + instrument #
-
-// BASS_ChannelSlideAttribute flags
-#define BASS_SLIDE_LOG 0x1000000
-
-// BASS_ChannelGetData flags
-#define BASS_DATA_AVAILABLE 0 // query how much data is buffered
-#define BASS_DATA_FIXED 0x20000000 // flag: return 8.24 fixed-point data
-#define BASS_DATA_FLOAT 0x40000000 // flag: return floating-point sample data
-#define BASS_DATA_FFT256 0x80000000 // 256 sample FFT
-#define BASS_DATA_FFT512 0x80000001 // 512 FFT
-#define BASS_DATA_FFT1024 0x80000002 // 1024 FFT
-#define BASS_DATA_FFT2048 0x80000003 // 2048 FFT
-#define BASS_DATA_FFT4096 0x80000004 // 4096 FFT
-#define BASS_DATA_FFT8192 0x80000005 // 8192 FFT
-#define BASS_DATA_FFT16384 0x80000006 // 16384 FFT
-#define BASS_DATA_FFT32768 0x80000007 // 32768 FFT
-#define BASS_DATA_FFT_INDIVIDUAL \
- 0x10 // FFT flag: FFT for each channel, else all combined
-#define BASS_DATA_FFT_NOWINDOW 0x20 // FFT flag: no Hanning window
-#define BASS_DATA_FFT_REMOVEDC 0x40 // FFT flag: pre-remove DC bias
-#define BASS_DATA_FFT_COMPLEX 0x80 // FFT flag: return complex data
-
-// BASS_ChannelGetLevelEx flags
-#define BASS_LEVEL_MONO 1
-#define BASS_LEVEL_STEREO 2
-#define BASS_LEVEL_RMS 4
-#define BASS_LEVEL_VOLPAN 8
-
-// BASS_ChannelGetTags types : what's returned
-#define BASS_TAG_ID3 0 // ID3v1 tags : TAG_ID3 structure
-#define BASS_TAG_ID3V2 1 // ID3v2 tags : variable length block
-#define BASS_TAG_OGG 2 // OGG comments : series of null-terminated UTF-8 strings
-#define BASS_TAG_HTTP 3 // HTTP headers : series of null-terminated ANSI strings
-#define BASS_TAG_ICY 4 // ICY headers : series of null-terminated ANSI strings
-#define BASS_TAG_META 5 // ICY metadata : ANSI string
-#define BASS_TAG_APE 6 // APE tags : series of null-terminated UTF-8 strings
-#define BASS_TAG_MP4 \
- 7 // MP4/iTunes metadata : series of null-terminated UTF-8 strings
-#define BASS_TAG_WMA 8 // WMA tags : series of null-terminated UTF-8 strings
-#define BASS_TAG_VENDOR 9 // OGG encoder : UTF-8 string
-#define BASS_TAG_LYRICS3 10 // Lyric3v2 tag : ASCII string
-#define BASS_TAG_CA_CODEC 11 // CoreAudio codec info : TAG_CA_CODEC structure
-#define BASS_TAG_MF \
- 13 // Media Foundation tags : series of null-terminated UTF-8 strings
-#define BASS_TAG_WAVEFORMAT 14 // WAVE format : WAVEFORMATEEX structure
-#define BASS_TAG_AM_MIME 15 // Android Media MIME type : ASCII string
-#define BASS_TAG_AM_NAME 16 // Android Media codec name : ASCII string
-#define BASS_TAG_RIFF_INFO \
- 0x100 // RIFF "INFO" tags : series of null-terminated ANSI strings
-#define BASS_TAG_RIFF_BEXT 0x101 // RIFF/BWF "bext" tags : TAG_BEXT structure
-#define BASS_TAG_RIFF_CART 0x102 // RIFF/BWF "cart" tags : TAG_CART structure
-#define BASS_TAG_RIFF_DISP 0x103 // RIFF "DISP" text tag : ANSI string
-#define BASS_TAG_RIFF_CUE 0x104 // RIFF "cue " chunk : TAG_CUE structure
-#define BASS_TAG_RIFF_SMPL 0x105 // RIFF "smpl" chunk : TAG_SMPL structure
-#define BASS_TAG_APE_BINARY \
- 0x1000 // + index #, binary APE tag : TAG_APE_BINARY structure
-#define BASS_TAG_MUSIC_NAME 0x10000 // MOD music name : ANSI string
-#define BASS_TAG_MUSIC_MESSAGE 0x10001 // MOD message : ANSI string
-#define BASS_TAG_MUSIC_ORDERS \
- 0x10002 // MOD order list : BYTE array of pattern numbers
-#define BASS_TAG_MUSIC_AUTH 0x10003 // MOD author : UTF-8 string
-#define BASS_TAG_MUSIC_INST \
- 0x10100 // + instrument #, MOD instrument name : ANSI string
-#define BASS_TAG_MUSIC_SAMPLE \
- 0x10300 // + sample #, MOD sample name : ANSI string
-
-// ID3v1 tag structure
-typedef struct {
- char id[3];
- char title[30];
- char artist[30];
- char album[30];
- char year[4];
- char comment[30];
- BYTE genre;
-} TAG_ID3;
-
-// Binary APE tag structure
-typedef struct {
- const char *key;
- const void *data;
- DWORD length;
-} TAG_APE_BINARY;
-
-// BWF "bext" tag structure
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4200)
-#endif
-#pragma pack(push, 1)
-typedef struct {
- char Description[256]; // description
- char Originator[32]; // name of the originator
- char OriginatorReference[32]; // reference of the originator
- char OriginationDate[10]; // date of creation (yyyy-mm-dd)
- char OriginationTime[8]; // time of creation (hh-mm-ss)
- QWORD TimeReference; // first sample count since midnight (little-endian)
- WORD Version; // BWF version (little-endian)
- BYTE UMID[64]; // SMPTE UMID
- BYTE Reserved[190];
-#if defined(__GNUC__) && __GNUC__ < 3
- char CodingHistory[0]; // history
-#elif 1 // change to 0 if compiler fails the following line
- char CodingHistory[]; // history
-#else
- char CodingHistory[1]; // history
-#endif
-} TAG_BEXT;
-#pragma pack(pop)
-
-// BWF "cart" tag structures
-typedef struct {
- DWORD dwUsage; // FOURCC timer usage ID
- DWORD dwValue; // timer value in samples from head
-} TAG_CART_TIMER;
-
-typedef struct {
- char Version[4]; // version of the data structure
- char Title[64]; // title of cart audio sequence
- char Artist[64]; // artist or creator name
- char CutID[64]; // cut number identification
- char ClientID[64]; // client identification
- char Category[64]; // category ID, PSA, NEWS, etc
- char Classification[64]; // classification or auxiliary key
- char OutCue[64]; // out cue text
- char StartDate[10]; // yyyy-mm-dd
- char StartTime[8]; // hh:mm:ss
- char EndDate[10]; // yyyy-mm-dd
- char EndTime[8]; // hh:mm:ss
- char ProducerAppID[64]; // name of vendor or application
- char ProducerAppVersion[64]; // version of producer application
- char UserDef[64]; // user defined text
- DWORD dwLevelReference; // sample value for 0 dB reference
- TAG_CART_TIMER PostTimer[8]; // 8 time markers after head
- char Reserved[276];
- char URL[1024]; // uniform resource locator
-#if defined(__GNUC__) && __GNUC__ < 3
- char TagText[0]; // free form text for scripts or tags
-#elif 1 // change to 0 if compiler fails the following line
- char TagText[]; // free form text for scripts or tags
-#else
- char TagText[1]; // free form text for scripts or tags
-#endif
-} TAG_CART;
-
-// RIFF "cue " tag structures
-typedef struct {
- DWORD dwName;
- DWORD dwPosition;
- DWORD fccChunk;
- DWORD dwChunkStart;
- DWORD dwBlockStart;
- DWORD dwSampleOffset;
-} TAG_CUE_POINT;
-
-typedef struct {
- DWORD dwCuePoints;
-#if defined(__GNUC__) && __GNUC__ < 3
- TAG_CUE_POINT CuePoints[0];
-#elif 1 // change to 0 if compiler fails the following line
- TAG_CUE_POINT CuePoints[];
-#else
- TAG_CUE_POINT CuePoints[1];
-#endif
-} TAG_CUE;
-
-// RIFF "smpl" tag structures
-typedef struct {
- DWORD dwIdentifier;
- DWORD dwType;
- DWORD dwStart;
- DWORD dwEnd;
- DWORD dwFraction;
- DWORD dwPlayCount;
-} TAG_SMPL_LOOP;
-
-typedef struct {
- DWORD dwManufacturer;
- DWORD dwProduct;
- DWORD dwSamplePeriod;
- DWORD dwMIDIUnityNote;
- DWORD dwMIDIPitchFraction;
- DWORD dwSMPTEFormat;
- DWORD dwSMPTEOffset;
- DWORD cSampleLoops;
- DWORD cbSamplerData;
-#if defined(__GNUC__) && __GNUC__ < 3
- TAG_SMPL_LOOP SampleLoops[0];
-#elif 1 // change to 0 if compiler fails the following line
- TAG_SMPL_LOOP SampleLoops[];
-#else
- TAG_SMPL_LOOP SampleLoops[1];
-#endif
-} TAG_SMPL;
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-// CoreAudio codec info structure
-typedef struct {
- DWORD ftype; // file format
- DWORD atype; // audio format
- const char *name; // description
-} TAG_CA_CODEC;
-
-#ifndef _WAVEFORMATEX_
-#define _WAVEFORMATEX_
-#pragma pack(push, 1)
-typedef struct tWAVEFORMATEX {
- WORD wFormatTag;
- WORD nChannels;
- DWORD nSamplesPerSec;
- DWORD nAvgBytesPerSec;
- WORD nBlockAlign;
- WORD wBitsPerSample;
- WORD cbSize;
-} WAVEFORMATEX, *PWAVEFORMATEX, *LPWAVEFORMATEX;
-typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
-#pragma pack(pop)
-#endif
-
-// BASS_ChannelGetLength/GetPosition/SetPosition modes
-#define BASS_POS_BYTE 0 // byte position
-#define BASS_POS_MUSIC_ORDER 1 // order.row position, MAKELONG(order,row)
-#define BASS_POS_OGG 3 // OGG bitstream number
-#define BASS_POS_RESET 0x2000000 // flag: reset user file buffers
-#define BASS_POS_RELATIVE \
- 0x4000000 // flag: seek relative to the current position
-#define BASS_POS_INEXACT 0x8000000 // flag: allow seeking to inexact position
-#define BASS_POS_DECODE \
- 0x10000000 // flag: get the decoding (not playing) position
-#define BASS_POS_DECODETO \
- 0x20000000 // flag: decode to the position instead of seeking
-#define BASS_POS_SCAN 0x40000000 // flag: scan to the position
-
-// BASS_ChannelSetDevice/GetDevice option
-#define BASS_NODEVICE 0x20000
-
-// BASS_RecordSetInput flags
-#define BASS_INPUT_OFF 0x10000
-#define BASS_INPUT_ON 0x20000
-
-#define BASS_INPUT_TYPE_MASK 0xff000000
-#define BASS_INPUT_TYPE_UNDEF 0x00000000
-#define BASS_INPUT_TYPE_DIGITAL 0x01000000
-#define BASS_INPUT_TYPE_LINE 0x02000000
-#define BASS_INPUT_TYPE_MIC 0x03000000
-#define BASS_INPUT_TYPE_SYNTH 0x04000000
-#define BASS_INPUT_TYPE_CD 0x05000000
-#define BASS_INPUT_TYPE_PHONE 0x06000000
-#define BASS_INPUT_TYPE_SPEAKER 0x07000000
-#define BASS_INPUT_TYPE_WAVE 0x08000000
-#define BASS_INPUT_TYPE_AUX 0x09000000
-#define BASS_INPUT_TYPE_ANALOG 0x0a000000
-
-// BASS_ChannelSetFX effect types
-#define BASS_FX_DX8_CHORUS 0
-#define BASS_FX_DX8_COMPRESSOR 1
-#define BASS_FX_DX8_DISTORTION 2
-#define BASS_FX_DX8_ECHO 3
-#define BASS_FX_DX8_FLANGER 4
-#define BASS_FX_DX8_GARGLE 5
-#define BASS_FX_DX8_I3DL2REVERB 6
-#define BASS_FX_DX8_PARAMEQ 7
-#define BASS_FX_DX8_REVERB 8
-#define BASS_FX_VOLUME 9
-
-typedef struct {
- float fWetDryMix;
- float fDepth;
- float fFeedback;
- float fFrequency;
- DWORD lWaveform; // 0=triangle, 1=sine
- float fDelay;
- DWORD lPhase; // BASS_DX8_PHASE_xxx
-} BASS_DX8_CHORUS;
-
-typedef struct {
- float fGain;
- float fAttack;
- float fRelease;
- float fThreshold;
- float fRatio;
- float fPredelay;
-} BASS_DX8_COMPRESSOR;
-
-typedef struct {
- float fGain;
- float fEdge;
- float fPostEQCenterFrequency;
- float fPostEQBandwidth;
- float fPreLowpassCutoff;
-} BASS_DX8_DISTORTION;
-
-typedef struct {
- float fWetDryMix;
- float fFeedback;
- float fLeftDelay;
- float fRightDelay;
- BOOL lPanDelay;
-} BASS_DX8_ECHO;
-
-typedef struct {
- float fWetDryMix;
- float fDepth;
- float fFeedback;
- float fFrequency;
- DWORD lWaveform; // 0=triangle, 1=sine
- float fDelay;
- DWORD lPhase; // BASS_DX8_PHASE_xxx
-} BASS_DX8_FLANGER;
-
-typedef struct {
- DWORD dwRateHz; // Rate of modulation in hz
- DWORD dwWaveShape; // 0=triangle, 1=square
-} BASS_DX8_GARGLE;
-
-typedef struct {
- int lRoom; // [-10000, 0] default: -1000 mB
- int lRoomHF; // [-10000, 0] default: 0 mB
- float flRoomRolloffFactor; // [0.0, 10.0] default: 0.0
- float flDecayTime; // [0.1, 20.0] default: 1.49s
- float flDecayHFRatio; // [0.1, 2.0] default: 0.83
- int lReflections; // [-10000, 1000] default: -2602 mB
- float flReflectionsDelay; // [0.0, 0.3] default: 0.007 s
- int lReverb; // [-10000, 2000] default: 200 mB
- float flReverbDelay; // [0.0, 0.1] default: 0.011 s
- float flDiffusion; // [0.0, 100.0] default: 100.0 %
- float flDensity; // [0.0, 100.0] default: 100.0 %
- float flHFReference; // [20.0, 20000.0] default: 5000.0 Hz
-} BASS_DX8_I3DL2REVERB;
-
-typedef struct {
- float fCenter;
- float fBandwidth;
- float fGain;
-} BASS_DX8_PARAMEQ;
-
-typedef struct {
- float fInGain; // [-96.0,0.0] default: 0.0 dB
- float fReverbMix; // [-96.0,0.0] default: 0.0 db
- float fReverbTime; // [0.001,3000.0] default: 1000.0 ms
- float fHighFreqRTRatio; // [0.001,0.999] default: 0.001
-} BASS_DX8_REVERB;
-
-#define BASS_DX8_PHASE_NEG_180 0
-#define BASS_DX8_PHASE_NEG_90 1
-#define BASS_DX8_PHASE_ZERO 2
-#define BASS_DX8_PHASE_90 3
-#define BASS_DX8_PHASE_180 4
-
-typedef struct {
- float fTarget;
- float fCurrent;
- float fTime;
- DWORD lCurve;
-} BASS_FX_VOLUME_PARAM;
-
-typedef void(CALLBACK IOSNOTIFYPROC)(DWORD status);
-/* iOS notification callback function.
-status : The notification (BASS_IOSNOTIFY_xxx) */
-
-#define BASS_IOSNOTIFY_INTERRUPT 1 // interruption started
-#define BASS_IOSNOTIFY_INTERRUPT_END 2 // interruption ended
-
-BOOL BASSDEF(BASS_SetConfig)(DWORD option, DWORD value);
-DWORD BASSDEF(BASS_GetConfig)(DWORD option);
-BOOL BASSDEF(BASS_SetConfigPtr)(DWORD option, const void *value);
-void *BASSDEF(BASS_GetConfigPtr)(DWORD option);
-DWORD BASSDEF(BASS_GetVersion)();
-int BASSDEF(BASS_ErrorGetCode)();
-BOOL BASSDEF(BASS_GetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info);
-#if defined(_WIN32) && !defined(_WIN32_WCE) && \
- !(WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
-BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, HWND win,
- const GUID *dsguid);
-#else
-BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, void *win,
- void *dsguid);
-#endif
-BOOL BASSDEF(BASS_SetDevice)(DWORD device);
-DWORD BASSDEF(BASS_GetDevice)();
-BOOL BASSDEF(BASS_Free)();
-#if defined(_WIN32) && !defined(_WIN32_WCE) && \
- !(WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
-void *BASSDEF(BASS_GetDSoundObject)(DWORD object);
-#endif
-BOOL BASSDEF(BASS_GetInfo)(BASS_INFO *info);
-BOOL BASSDEF(BASS_Update)(DWORD length);
-float BASSDEF(BASS_GetCPU)();
-BOOL BASSDEF(BASS_Start)();
-BOOL BASSDEF(BASS_Stop)();
-BOOL BASSDEF(BASS_Pause)();
-BOOL BASSDEF(BASS_SetVolume)(float volume);
-float BASSDEF(BASS_GetVolume)();
-
-HPLUGIN BASSDEF(BASS_PluginLoad)(const char *file, DWORD flags);
-BOOL BASSDEF(BASS_PluginFree)(HPLUGIN handle);
-const BASS_PLUGININFO *BASSDEF(BASS_PluginGetInfo)(HPLUGIN handle);
-
-BOOL BASSDEF(BASS_Set3DFactors)(float distf, float rollf, float doppf);
-BOOL BASSDEF(BASS_Get3DFactors)(float *distf, float *rollf, float *doppf);
-BOOL BASSDEF(BASS_Set3DPosition)(const BASS_3DVECTOR *pos,
- const BASS_3DVECTOR *vel,
- const BASS_3DVECTOR *front,
- const BASS_3DVECTOR *top);
-BOOL BASSDEF(BASS_Get3DPosition)(BASS_3DVECTOR *pos, BASS_3DVECTOR *vel,
- BASS_3DVECTOR *front, BASS_3DVECTOR *top);
-void BASSDEF(BASS_Apply3D)();
-#if defined(_WIN32) && !defined(_WIN32_WCE) && \
- !(WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
-BOOL BASSDEF(BASS_SetEAXParameters)(int env, float vol, float decay,
- float damp);
-BOOL BASSDEF(BASS_GetEAXParameters)(DWORD *env, float *vol, float *decay,
- float *damp);
-#endif
-
-HMUSIC BASSDEF(BASS_MusicLoad)(BOOL mem, const void *file, QWORD offset,
- DWORD length, DWORD flags, DWORD freq);
-BOOL BASSDEF(BASS_MusicFree)(HMUSIC handle);
-
-HSAMPLE BASSDEF(BASS_SampleLoad)(BOOL mem, const void *file, QWORD offset,
- DWORD length, DWORD max, DWORD flags);
-HSAMPLE BASSDEF(BASS_SampleCreate)(DWORD length, DWORD freq, DWORD chans,
- DWORD max, DWORD flags);
-BOOL BASSDEF(BASS_SampleFree)(HSAMPLE handle);
-BOOL BASSDEF(BASS_SampleSetData)(HSAMPLE handle, const void *buffer);
-BOOL BASSDEF(BASS_SampleGetData)(HSAMPLE handle, void *buffer);
-BOOL BASSDEF(BASS_SampleGetInfo)(HSAMPLE handle, BASS_SAMPLE *info);
-BOOL BASSDEF(BASS_SampleSetInfo)(HSAMPLE handle, const BASS_SAMPLE *info);
-HCHANNEL BASSDEF(BASS_SampleGetChannel)(HSAMPLE handle, BOOL onlynew);
-DWORD BASSDEF(BASS_SampleGetChannels)(HSAMPLE handle, HCHANNEL *channels);
-BOOL BASSDEF(BASS_SampleStop)(HSAMPLE handle);
-
-HSTREAM BASSDEF(BASS_StreamCreate)(DWORD freq, DWORD chans, DWORD flags,
- STREAMPROC *proc, void *user);
-HSTREAM BASSDEF(BASS_StreamCreateFile)(BOOL mem, const void *file, QWORD offset,
- QWORD length, DWORD flags);
-HSTREAM BASSDEF(BASS_StreamCreateURL)(const char *url, DWORD offset,
- DWORD flags, DOWNLOADPROC *proc,
- void *user);
-HSTREAM BASSDEF(BASS_StreamCreateFileUser)(DWORD system, DWORD flags,
- const BASS_FILEPROCS *proc,
- void *user);
-BOOL BASSDEF(BASS_StreamFree)(HSTREAM handle);
-QWORD BASSDEF(BASS_StreamGetFilePosition)(HSTREAM handle, DWORD mode);
-DWORD BASSDEF(BASS_StreamPutData)(HSTREAM handle, const void *buffer,
- DWORD length);
-DWORD BASSDEF(BASS_StreamPutFileData)(HSTREAM handle, const void *buffer,
- DWORD length);
-
-BOOL BASSDEF(BASS_RecordGetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info);
-BOOL BASSDEF(BASS_RecordInit)(int device);
-BOOL BASSDEF(BASS_RecordSetDevice)(DWORD device);
-DWORD BASSDEF(BASS_RecordGetDevice)();
-BOOL BASSDEF(BASS_RecordFree)();
-BOOL BASSDEF(BASS_RecordGetInfo)(BASS_RECORDINFO *info);
-const char *BASSDEF(BASS_RecordGetInputName)(int input);
-BOOL BASSDEF(BASS_RecordSetInput)(int input, DWORD flags, float volume);
-DWORD BASSDEF(BASS_RecordGetInput)(int input, float *volume);
-HRECORD BASSDEF(BASS_RecordStart)(DWORD freq, DWORD chans, DWORD flags,
- RECORDPROC *proc, void *user);
-
-double BASSDEF(BASS_ChannelBytes2Seconds)(DWORD handle, QWORD pos);
-QWORD BASSDEF(BASS_ChannelSeconds2Bytes)(DWORD handle, double pos);
-DWORD BASSDEF(BASS_ChannelGetDevice)(DWORD handle);
-BOOL BASSDEF(BASS_ChannelSetDevice)(DWORD handle, DWORD device);
-DWORD BASSDEF(BASS_ChannelIsActive)(DWORD handle);
-BOOL BASSDEF(BASS_ChannelGetInfo)(DWORD handle, BASS_CHANNELINFO *info);
-const char *BASSDEF(BASS_ChannelGetTags)(DWORD handle, DWORD tags);
-DWORD BASSDEF(BASS_ChannelFlags)(DWORD handle, DWORD flags, DWORD mask);
-BOOL BASSDEF(BASS_ChannelUpdate)(DWORD handle, DWORD length);
-BOOL BASSDEF(BASS_ChannelLock)(DWORD handle, BOOL lock);
-BOOL BASSDEF(BASS_ChannelPlay)(DWORD handle, BOOL restart);
-BOOL BASSDEF(BASS_ChannelStop)(DWORD handle);
-BOOL BASSDEF(BASS_ChannelPause)(DWORD handle);
-BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value);
-BOOL BASSDEF(BASS_ChannelGetAttribute)(DWORD handle, DWORD attrib,
- float *value);
-BOOL BASSDEF(BASS_ChannelSlideAttribute)(DWORD handle, DWORD attrib,
- float value, DWORD time);
-BOOL BASSDEF(BASS_ChannelIsSliding)(DWORD handle, DWORD attrib);
-BOOL BASSDEF(BASS_ChannelSetAttributeEx)(DWORD handle, DWORD attrib,
- void *value, DWORD size);
-DWORD BASSDEF(BASS_ChannelGetAttributeEx)(DWORD handle, DWORD attrib,
- void *value, DWORD size);
-BOOL BASSDEF(BASS_ChannelSet3DAttributes)(DWORD handle, int mode, float min,
- float max, int iangle, int oangle,
- float outvol);
-BOOL BASSDEF(BASS_ChannelGet3DAttributes)(DWORD handle, DWORD *mode, float *min,
- float *max, DWORD *iangle,
- DWORD *oangle, float *outvol);
-BOOL BASSDEF(BASS_ChannelSet3DPosition)(DWORD handle, const BASS_3DVECTOR *pos,
- const BASS_3DVECTOR *orient,
- const BASS_3DVECTOR *vel);
-BOOL BASSDEF(BASS_ChannelGet3DPosition)(DWORD handle, BASS_3DVECTOR *pos,
- BASS_3DVECTOR *orient,
- BASS_3DVECTOR *vel);
-QWORD BASSDEF(BASS_ChannelGetLength)(DWORD handle, DWORD mode);
-BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode);
-QWORD BASSDEF(BASS_ChannelGetPosition)(DWORD handle, DWORD mode);
-DWORD BASSDEF(BASS_ChannelGetLevel)(DWORD handle);
-BOOL BASSDEF(BASS_ChannelGetLevelEx)(DWORD handle, float *levels, float length,
- DWORD flags);
-DWORD BASSDEF(BASS_ChannelGetData)(DWORD handle, void *buffer, DWORD length);
-HSYNC BASSDEF(BASS_ChannelSetSync)(DWORD handle, DWORD type, QWORD param,
- SYNCPROC *proc, void *user);
-BOOL BASSDEF(BASS_ChannelRemoveSync)(DWORD handle, HSYNC sync);
-HDSP BASSDEF(BASS_ChannelSetDSP)(DWORD handle, DSPPROC *proc, void *user,
- int priority);
-BOOL BASSDEF(BASS_ChannelRemoveDSP)(DWORD handle, HDSP dsp);
-BOOL BASSDEF(BASS_ChannelSetLink)(DWORD handle, DWORD chan);
-BOOL BASSDEF(BASS_ChannelRemoveLink)(DWORD handle, DWORD chan);
-HFX BASSDEF(BASS_ChannelSetFX)(DWORD handle, DWORD type, int priority);
-BOOL BASSDEF(BASS_ChannelRemoveFX)(DWORD handle, HFX fx);
-
-BOOL BASSDEF(BASS_FXSetParameters)(HFX handle, const void *params);
-BOOL BASSDEF(BASS_FXGetParameters)(HFX handle, void *params);
-BOOL BASSDEF(BASS_FXReset)(HFX handle);
-BOOL BASSDEF(BASS_FXSetPriority)(HFX handle, int priority);
-
-#ifdef __cplusplus
-}
-
-#if defined(_WIN32) && !defined(NOBASSOVERLOADS)
-static inline HPLUGIN BASS_PluginLoad(const WCHAR *file, DWORD flags)
-{
- return BASS_PluginLoad((const char *)file, flags | BASS_UNICODE);
-}
-
-static inline HMUSIC BASS_MusicLoad(BOOL mem, const WCHAR *file, QWORD offset,
- DWORD length, DWORD flags, DWORD freq)
-{
- return BASS_MusicLoad(mem, (const void *)file, offset, length,
- flags | BASS_UNICODE, freq);
-}
-
-static inline HSAMPLE BASS_SampleLoad(BOOL mem, const WCHAR *file, QWORD offset,
- DWORD length, DWORD max, DWORD flags)
-{
- return BASS_SampleLoad(mem, (const void *)file, offset, length, max,
- flags | BASS_UNICODE);
-}
-
-static inline HSTREAM BASS_StreamCreateFile(BOOL mem, const WCHAR *file,
- QWORD offset, QWORD length,
- DWORD flags)
-{
- return BASS_StreamCreateFile(mem, (const void *)file, offset, length,
- flags | BASS_UNICODE);
-}
-
-static inline HSTREAM BASS_StreamCreateURL(const WCHAR *url, DWORD offset,
- DWORD flags, DOWNLOADPROC *proc,
- void *user)
-{
- return BASS_StreamCreateURL((const char *)url, offset, flags | BASS_UNICODE,
- proc, user);
-}
-
-static inline BOOL BASS_SetConfigPtr(DWORD option, const WCHAR *value)
-{
- return BASS_SetConfigPtr(option | BASS_UNICODE, (const void *)value);
-}
-#endif
-#endif
-
-#endif
+/*
+ BASS 2.4 C/C++ header file
+ Copyright (c) 1999-2019 Un4seen Developments Ltd.
+
+ See the BASS.CHM file for more detailed documentation
+*/
+
+#ifndef BASS_H
+#define BASS_H
+
+#ifdef _WIN32
+#include <wtypes.h>
+typedef unsigned __int64 QWORD;
+#else
+#include <stdint.h>
+#define WINAPI
+#define CALLBACK
+typedef uint8_t BYTE;
+typedef uint16_t WORD;
+typedef uint32_t DWORD;
+typedef uint64_t QWORD;
+#ifndef __OBJC__
+typedef int BOOL;
+#endif
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+#define LOBYTE(a) (BYTE)(a)
+#define HIBYTE(a) (BYTE)((a) >> 8)
+#define LOWORD(a) (WORD)(a)
+#define HIWORD(a) (WORD)((a) >> 16)
+#define MAKEWORD(a, b) (WORD)(((a)&0xff) | ((b) << 8))
+#define MAKELONG(a, b) (DWORD)(((a)&0xffff) | ((b) << 16))
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BASSVERSION 0x204 // API version
+#define BASSVERSIONTEXT "2.4"
+
+#ifndef BASSDEF
+#define BASSDEF(f) WINAPI f
+#else
+#define NOBASSOVERLOADS
+#endif
+
+typedef DWORD HMUSIC; // MOD music handle
+typedef DWORD HSAMPLE; // sample handle
+typedef DWORD HCHANNEL; // playing sample's channel handle
+typedef DWORD HSTREAM; // sample stream handle
+typedef DWORD HRECORD; // recording handle
+typedef DWORD HSYNC; // synchronizer handle
+typedef DWORD HDSP; // DSP handle
+typedef DWORD HFX; // DX8 effect handle
+typedef DWORD HPLUGIN; // Plugin handle
+
+// Error codes returned by BASS_ErrorGetCode
+#define BASS_OK 0 // all is OK
+#define BASS_ERROR_MEM 1 // memory error
+#define BASS_ERROR_FILEOPEN 2 // can't open the file
+#define BASS_ERROR_DRIVER 3 // can't find a free/valid driver
+#define BASS_ERROR_BUFLOST 4 // the sample buffer was lost
+#define BASS_ERROR_HANDLE 5 // invalid handle
+#define BASS_ERROR_FORMAT 6 // unsupported sample format
+#define BASS_ERROR_POSITION 7 // invalid position
+#define BASS_ERROR_INIT 8 // BASS_Init has not been successfully called
+#define BASS_ERROR_START 9 // BASS_Start has not been successfully called
+#define BASS_ERROR_SSL 10 // SSL/HTTPS support isn't available
+#define BASS_ERROR_ALREADY 14 // already initialized/paused/whatever
+#define BASS_ERROR_NOCHAN 18 // can't get a free channel
+#define BASS_ERROR_ILLTYPE 19 // an illegal type was specified
+#define BASS_ERROR_ILLPARAM 20 // an illegal parameter was specified
+#define BASS_ERROR_NO3D 21 // no 3D support
+#define BASS_ERROR_NOEAX 22 // no EAX support
+#define BASS_ERROR_DEVICE 23 // illegal device number
+#define BASS_ERROR_NOPLAY 24 // not playing
+#define BASS_ERROR_FREQ 25 // illegal sample rate
+#define BASS_ERROR_NOTFILE 27 // the stream is not a file stream
+#define BASS_ERROR_NOHW 29 // no hardware voices available
+#define BASS_ERROR_EMPTY 31 // the MOD music has no sequence data
+#define BASS_ERROR_NONET 32 // no internet connection could be opened
+#define BASS_ERROR_CREATE 33 // couldn't create the file
+#define BASS_ERROR_NOFX 34 // effects are not available
+#define BASS_ERROR_NOTAVAIL 37 // requested data/action is not available
+#define BASS_ERROR_DECODE 38 // the channel is/isn't a "decoding channel"
+#define BASS_ERROR_DX 39 // a sufficient DirectX version is not installed
+#define BASS_ERROR_TIMEOUT 40 // connection timedout
+#define BASS_ERROR_FILEFORM 41 // unsupported file format
+#define BASS_ERROR_SPEAKER 42 // unavailable speaker
+#define BASS_ERROR_VERSION 43 // invalid BASS version (used by add-ons)
+#define BASS_ERROR_CODEC 44 // codec is not available/supported
+#define BASS_ERROR_ENDED 45 // the channel/file has ended
+#define BASS_ERROR_BUSY 46 // the device is busy
+#define BASS_ERROR_UNKNOWN -1 // some other mystery problem
+
+// BASS_SetConfig options
+#define BASS_CONFIG_BUFFER 0
+#define BASS_CONFIG_UPDATEPERIOD 1
+#define BASS_CONFIG_GVOL_SAMPLE 4
+#define BASS_CONFIG_GVOL_STREAM 5
+#define BASS_CONFIG_GVOL_MUSIC 6
+#define BASS_CONFIG_CURVE_VOL 7
+#define BASS_CONFIG_CURVE_PAN 8
+#define BASS_CONFIG_FLOATDSP 9
+#define BASS_CONFIG_3DALGORITHM 10
+#define BASS_CONFIG_NET_TIMEOUT 11
+#define BASS_CONFIG_NET_BUFFER 12
+#define BASS_CONFIG_PAUSE_NOPLAY 13
+#define BASS_CONFIG_NET_PREBUF 15
+#define BASS_CONFIG_NET_PASSIVE 18
+#define BASS_CONFIG_REC_BUFFER 19
+#define BASS_CONFIG_NET_PLAYLIST 21
+#define BASS_CONFIG_MUSIC_VIRTUAL 22
+#define BASS_CONFIG_VERIFY 23
+#define BASS_CONFIG_UPDATETHREADS 24
+#define BASS_CONFIG_DEV_BUFFER 27
+#define BASS_CONFIG_REC_LOOPBACK 28
+#define BASS_CONFIG_VISTA_TRUEPOS 30
+#define BASS_CONFIG_IOS_MIXAUDIO 34
+#define BASS_CONFIG_DEV_DEFAULT 36
+#define BASS_CONFIG_NET_READTIMEOUT 37
+#define BASS_CONFIG_VISTA_SPEAKERS 38
+#define BASS_CONFIG_IOS_SPEAKER 39
+#define BASS_CONFIG_MF_DISABLE 40
+#define BASS_CONFIG_HANDLES 41
+#define BASS_CONFIG_UNICODE 42
+#define BASS_CONFIG_SRC 43
+#define BASS_CONFIG_SRC_SAMPLE 44
+#define BASS_CONFIG_ASYNCFILE_BUFFER 45
+#define BASS_CONFIG_OGG_PRESCAN 47
+#define BASS_CONFIG_MF_VIDEO 48
+#define BASS_CONFIG_AIRPLAY 49
+#define BASS_CONFIG_DEV_NONSTOP 50
+#define BASS_CONFIG_IOS_NOCATEGORY 51
+#define BASS_CONFIG_VERIFY_NET 52
+#define BASS_CONFIG_DEV_PERIOD 53
+#define BASS_CONFIG_FLOAT 54
+#define BASS_CONFIG_NET_SEEK 56
+#define BASS_CONFIG_AM_DISABLE 58
+#define BASS_CONFIG_NET_PLAYLIST_DEPTH 59
+#define BASS_CONFIG_NET_PREBUF_WAIT 60
+#define BASS_CONFIG_WASAPI_PERSIST 65
+#define BASS_CONFIG_REC_WASAPI 66
+
+// BASS_SetConfigPtr options
+#define BASS_CONFIG_NET_AGENT 16
+#define BASS_CONFIG_NET_PROXY 17
+#define BASS_CONFIG_IOS_NOTIFY 46
+#define BASS_CONFIG_LIBSSL 64
+
+// BASS_Init flags
+#define BASS_DEVICE_8BITS 1 // 8 bit
+#define BASS_DEVICE_MONO 2 // mono
+#define BASS_DEVICE_3D 4 // enable 3D functionality
+#define BASS_DEVICE_16BITS 8 // limit output to 16 bit
+#define BASS_DEVICE_LATENCY 0x100 // calculate device latency (BASS_INFO struct)
+#define BASS_DEVICE_CPSPEAKERS \
+ 0x400 // detect speakers via Windows control panel
+#define BASS_DEVICE_SPEAKERS 0x800 // force enabling of speaker assignment
+#define BASS_DEVICE_NOSPEAKER 0x1000 // ignore speaker arrangement
+#define BASS_DEVICE_DMIX 0x2000 // use ALSA "dmix" plugin
+#define BASS_DEVICE_FREQ 0x4000 // set device sample rate
+#define BASS_DEVICE_STEREO 0x8000 // limit output to stereo
+#define BASS_DEVICE_HOG 0x10000 // hog/exclusive mode
+#define BASS_DEVICE_AUDIOTRACK 0x20000 // use AudioTrack output
+#define BASS_DEVICE_DSOUND 0x40000 // use DirectSound output
+
+// DirectSound interfaces (for use with BASS_GetDSoundObject)
+#define BASS_OBJECT_DS 1 // IDirectSound
+#define BASS_OBJECT_DS3DL 2 // IDirectSound3DListener
+
+// Device info structure
+typedef struct {
+#if defined(_WIN32_WCE) || \
+ (WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
+ const wchar_t *name; // description
+ const wchar_t *driver; // driver
+#else
+ const char *name; // description
+ const char *driver; // driver
+#endif
+ DWORD flags;
+} BASS_DEVICEINFO;
+
+// BASS_DEVICEINFO flags
+#define BASS_DEVICE_ENABLED 1
+#define BASS_DEVICE_DEFAULT 2
+#define BASS_DEVICE_INIT 4
+#define BASS_DEVICE_LOOPBACK 8
+
+#define BASS_DEVICE_TYPE_MASK 0xff000000
+#define BASS_DEVICE_TYPE_NETWORK 0x01000000
+#define BASS_DEVICE_TYPE_SPEAKERS 0x02000000
+#define BASS_DEVICE_TYPE_LINE 0x03000000
+#define BASS_DEVICE_TYPE_HEADPHONES 0x04000000
+#define BASS_DEVICE_TYPE_MICROPHONE 0x05000000
+#define BASS_DEVICE_TYPE_HEADSET 0x06000000
+#define BASS_DEVICE_TYPE_HANDSET 0x07000000
+#define BASS_DEVICE_TYPE_DIGITAL 0x08000000
+#define BASS_DEVICE_TYPE_SPDIF 0x09000000
+#define BASS_DEVICE_TYPE_HDMI 0x0a000000
+#define BASS_DEVICE_TYPE_DISPLAYPORT 0x40000000
+
+// BASS_GetDeviceInfo flags
+#define BASS_DEVICES_AIRPLAY 0x1000000
+
+typedef struct {
+ DWORD flags; // device capabilities (DSCAPS_xxx flags)
+ DWORD hwsize; // size of total device hardware memory
+ DWORD hwfree; // size of free device hardware memory
+ DWORD freesam; // number of free sample slots in the hardware
+ DWORD free3d; // number of free 3D sample slots in the hardware
+ DWORD minrate; // min sample rate supported by the hardware
+ DWORD maxrate; // max sample rate supported by the hardware
+ BOOL
+ eax; // device supports EAX? (always FALSE if BASS_DEVICE_3D was not used)
+ DWORD minbuf; // recommended minimum buffer length in ms (requires
+ // BASS_DEVICE_LATENCY)
+ DWORD dsver; // DirectSound version
+ DWORD latency; // delay (in ms) before start of playback (requires
+ // BASS_DEVICE_LATENCY)
+ DWORD initflags; // BASS_Init "flags" parameter
+ DWORD speakers; // number of speakers available
+ DWORD freq; // current output rate
+} BASS_INFO;
+
+// BASS_INFO flags (from DSOUND.H)
+#define DSCAPS_CONTINUOUSRATE \
+ 0x00000010 // supports all sample rates between min/maxrate
+#define DSCAPS_EMULDRIVER \
+ 0x00000020 // device does NOT have hardware DirectSound support
+#define DSCAPS_CERTIFIED \
+ 0x00000040 // device driver has been certified by Microsoft
+#define DSCAPS_SECONDARYMONO 0x00000100 // mono
+#define DSCAPS_SECONDARYSTEREO 0x00000200 // stereo
+#define DSCAPS_SECONDARY8BIT 0x00000400 // 8 bit
+#define DSCAPS_SECONDARY16BIT 0x00000800 // 16 bit
+
+// Recording device info structure
+typedef struct {
+ DWORD flags; // device capabilities (DSCCAPS_xxx flags)
+ DWORD formats; // supported standard formats (WAVE_FORMAT_xxx flags)
+ DWORD inputs; // number of inputs
+ BOOL singlein; // TRUE = only 1 input can be set at a time
+ DWORD freq; // current input rate
+} BASS_RECORDINFO;
+
+// BASS_RECORDINFO flags (from DSOUND.H)
+#define DSCCAPS_EMULDRIVER \
+ DSCAPS_EMULDRIVER // device does NOT have hardware DirectSound recording
+ // support
+#define DSCCAPS_CERTIFIED \
+ DSCAPS_CERTIFIED // device driver has been certified by Microsoft
+
+// defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H)
+#ifndef WAVE_FORMAT_1M08
+#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */
+#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */
+#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */
+#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */
+#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */
+#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */
+#endif
+
+// Sample info structure
+typedef struct {
+ DWORD freq; // default playback rate
+ float volume; // default volume (0-1)
+ float pan; // default pan (-1=left, 0=middle, 1=right)
+ DWORD flags; // BASS_SAMPLE_xxx flags
+ DWORD length; // length (in bytes)
+ DWORD max; // maximum simultaneous playbacks
+ DWORD origres; // original resolution
+ DWORD chans; // number of channels
+ DWORD mingap; // minimum gap (ms) between creating channels
+ DWORD mode3d; // BASS_3DMODE_xxx mode
+ float mindist; // minimum distance
+ float maxdist; // maximum distance
+ DWORD iangle; // angle of inside projection cone
+ DWORD oangle; // angle of outside projection cone
+ float outvol; // delta-volume outside the projection cone
+ DWORD vam; // voice allocation/management flags (BASS_VAM_xxx)
+ DWORD priority; // priority (0=lowest, 0xffffffff=highest)
+} BASS_SAMPLE;
+
+#define BASS_SAMPLE_8BITS 1 // 8 bit
+#define BASS_SAMPLE_FLOAT 256 // 32 bit floating-point
+#define BASS_SAMPLE_MONO 2 // mono
+#define BASS_SAMPLE_LOOP 4 // looped
+#define BASS_SAMPLE_3D 8 // 3D functionality
+#define BASS_SAMPLE_SOFTWARE 16 // not using hardware mixing
+#define BASS_SAMPLE_MUTEMAX 32 // mute at max distance (3D only)
+#define BASS_SAMPLE_VAM 64 // DX7 voice allocation & management
+#define BASS_SAMPLE_FX 128 // old implementation of DX8 effects
+#define BASS_SAMPLE_OVER_VOL 0x10000 // override lowest volume
+#define BASS_SAMPLE_OVER_POS 0x20000 // override longest playing
+#define BASS_SAMPLE_OVER_DIST \
+ 0x30000 // override furthest from listener (3D only)
+
+#define BASS_STREAM_PRESCAN \
+ 0x20000 // enable pin-point seeking/length (MP3/MP2/MP1)
+#define BASS_STREAM_AUTOFREE \
+ 0x40000 // automatically free the stream when it stop/ends
+#define BASS_STREAM_RESTRATE \
+ 0x80000 // restrict the download rate of internet file streams
+#define BASS_STREAM_BLOCK \
+ 0x100000 // download/play internet file stream in small blocks
+#define BASS_STREAM_DECODE \
+ 0x200000 // don't play the stream, only decode (BASS_ChannelGetData)
+#define BASS_STREAM_STATUS \
+ 0x800000 // give server status info (HTTP/ICY tags) in DOWNLOADPROC
+
+#define BASS_MP3_IGNOREDELAY \
+ 0x200 // ignore LAME/Xing/VBRI/iTunes delay & padding info
+#define BASS_MP3_SETPOS BASS_STREAM_PRESCAN
+
+#define BASS_MUSIC_FLOAT BASS_SAMPLE_FLOAT
+#define BASS_MUSIC_MONO BASS_SAMPLE_MONO
+#define BASS_MUSIC_LOOP BASS_SAMPLE_LOOP
+#define BASS_MUSIC_3D BASS_SAMPLE_3D
+#define BASS_MUSIC_FX BASS_SAMPLE_FX
+#define BASS_MUSIC_AUTOFREE BASS_STREAM_AUTOFREE
+#define BASS_MUSIC_DECODE BASS_STREAM_DECODE
+#define BASS_MUSIC_PRESCAN BASS_STREAM_PRESCAN // calculate playback length
+#define BASS_MUSIC_CALCLEN BASS_MUSIC_PRESCAN
+#define BASS_MUSIC_RAMP 0x200 // normal ramping
+#define BASS_MUSIC_RAMPS 0x400 // sensitive ramping
+#define BASS_MUSIC_SURROUND 0x800 // surround sound
+#define BASS_MUSIC_SURROUND2 0x1000 // surround sound (mode 2)
+#define BASS_MUSIC_FT2PAN 0x2000 // apply FastTracker 2 panning to XM files
+#define BASS_MUSIC_FT2MOD 0x2000 // play .MOD as FastTracker 2 does
+#define BASS_MUSIC_PT1MOD 0x4000 // play .MOD as ProTracker 1 does
+#define BASS_MUSIC_NONINTER 0x10000 // non-interpolated sample mixing
+#define BASS_MUSIC_SINCINTER 0x800000 // sinc interpolated sample mixing
+#define BASS_MUSIC_POSRESET 0x8000 // stop all notes when moving position
+#define BASS_MUSIC_POSRESETEX \
+ 0x400000 // stop all notes and reset bmp/etc when moving position
+#define BASS_MUSIC_STOPBACK 0x80000 // stop the music on a backwards jump effect
+#define BASS_MUSIC_NOSAMPLE 0x100000 // don't load the samples
+
+// Speaker assignment flags
+#define BASS_SPEAKER_FRONT 0x1000000 // front speakers
+#define BASS_SPEAKER_REAR 0x2000000 // rear/side speakers
+#define BASS_SPEAKER_CENLFE 0x3000000 // center & LFE speakers (5.1)
+#define BASS_SPEAKER_REAR2 0x4000000 // rear center speakers (7.1)
+#define BASS_SPEAKER_N(n) ((n) << 24) // n'th pair of speakers (max 15)
+#define BASS_SPEAKER_LEFT 0x10000000 // modifier: left
+#define BASS_SPEAKER_RIGHT 0x20000000 // modifier: right
+#define BASS_SPEAKER_FRONTLEFT BASS_SPEAKER_FRONT | BASS_SPEAKER_LEFT
+#define BASS_SPEAKER_FRONTRIGHT BASS_SPEAKER_FRONT | BASS_SPEAKER_RIGHT
+#define BASS_SPEAKER_REARLEFT BASS_SPEAKER_REAR | BASS_SPEAKER_LEFT
+#define BASS_SPEAKER_REARRIGHT BASS_SPEAKER_REAR | BASS_SPEAKER_RIGHT
+#define BASS_SPEAKER_CENTER BASS_SPEAKER_CENLFE | BASS_SPEAKER_LEFT
+#define BASS_SPEAKER_LFE BASS_SPEAKER_CENLFE | BASS_SPEAKER_RIGHT
+#define BASS_SPEAKER_REAR2LEFT BASS_SPEAKER_REAR2 | BASS_SPEAKER_LEFT
+#define BASS_SPEAKER_REAR2RIGHT BASS_SPEAKER_REAR2 | BASS_SPEAKER_RIGHT
+
+#define BASS_ASYNCFILE 0x40000000
+#define BASS_UNICODE 0x80000000
+
+#define BASS_RECORD_PAUSE 0x8000 // start recording paused
+#define BASS_RECORD_ECHOCANCEL 0x2000
+#define BASS_RECORD_AGC 0x4000
+
+// DX7 voice allocation & management flags
+#define BASS_VAM_HARDWARE 1
+#define BASS_VAM_SOFTWARE 2
+#define BASS_VAM_TERM_TIME 4
+#define BASS_VAM_TERM_DIST 8
+#define BASS_VAM_TERM_PRIO 16
+
+// Channel info structure
+typedef struct {
+ DWORD freq; // default playback rate
+ DWORD chans; // channels
+ DWORD flags; // BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags
+ DWORD ctype; // type of channel
+ DWORD origres; // original resolution
+ HPLUGIN plugin; // plugin
+ HSAMPLE sample; // sample
+ const char *filename; // filename
+} BASS_CHANNELINFO;
+
+#define BASS_ORIGRES_FLOAT 0x10000
+
+// BASS_CHANNELINFO types
+#define BASS_CTYPE_SAMPLE 1
+#define BASS_CTYPE_RECORD 2
+#define BASS_CTYPE_STREAM 0x10000
+#define BASS_CTYPE_STREAM_OGG 0x10002
+#define BASS_CTYPE_STREAM_MP1 0x10003
+#define BASS_CTYPE_STREAM_MP2 0x10004
+#define BASS_CTYPE_STREAM_MP3 0x10005
+#define BASS_CTYPE_STREAM_AIFF 0x10006
+#define BASS_CTYPE_STREAM_CA 0x10007
+#define BASS_CTYPE_STREAM_MF 0x10008
+#define BASS_CTYPE_STREAM_AM 0x10009
+#define BASS_CTYPE_STREAM_DUMMY 0x18000
+#define BASS_CTYPE_STREAM_DEVICE 0x18001
+#define BASS_CTYPE_STREAM_WAV 0x40000 // WAVE flag, LOWORD=codec
+#define BASS_CTYPE_STREAM_WAV_PCM 0x50001
+#define BASS_CTYPE_STREAM_WAV_FLOAT 0x50003
+#define BASS_CTYPE_MUSIC_MOD 0x20000
+#define BASS_CTYPE_MUSIC_MTM 0x20001
+#define BASS_CTYPE_MUSIC_S3M 0x20002
+#define BASS_CTYPE_MUSIC_XM 0x20003
+#define BASS_CTYPE_MUSIC_IT 0x20004
+#define BASS_CTYPE_MUSIC_MO3 0x00100 // MO3 flag
+
+typedef struct {
+ DWORD ctype; // channel type
+#if defined(_WIN32_WCE) || \
+ (WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
+ const wchar_t *name; // format description
+ const wchar_t *exts; // file extension filter (*.ext1;*.ext2;etc...)
+#else
+ const char *name; // format description
+ const char *exts; // file extension filter (*.ext1;*.ext2;etc...)
+#endif
+} BASS_PLUGINFORM;
+
+typedef struct {
+ DWORD version; // version (same form as BASS_GetVersion)
+ DWORD formatc; // number of formats
+ const BASS_PLUGINFORM *formats; // the array of formats
+} BASS_PLUGININFO;
+
+// 3D vector (for 3D positions/velocities/orientations)
+typedef struct BASS_3DVECTOR {
+#ifdef __cplusplus
+ BASS_3DVECTOR(){};
+ BASS_3DVECTOR(float _x, float _y, float _z) : x(_x), y(_y), z(_z){};
+#endif
+ float x; // +=right, -=left
+ float y; // +=up, -=down
+ float z; // +=front, -=behind
+} BASS_3DVECTOR;
+
+// 3D channel modes
+#define BASS_3DMODE_NORMAL 0 // normal 3D processing
+#define BASS_3DMODE_RELATIVE 1 // position is relative to the listener
+#define BASS_3DMODE_OFF 2 // no 3D processing
+
+// software 3D mixing algorithms (used with BASS_CONFIG_3DALGORITHM)
+#define BASS_3DALG_DEFAULT 0
+#define BASS_3DALG_OFF 1
+#define BASS_3DALG_FULL 2
+#define BASS_3DALG_LIGHT 3
+
+// EAX environments, use with BASS_SetEAXParameters
+enum {
+ EAX_ENVIRONMENT_GENERIC,
+ EAX_ENVIRONMENT_PADDEDCELL,
+ EAX_ENVIRONMENT_ROOM,
+ EAX_ENVIRONMENT_BATHROOM,
+ EAX_ENVIRONMENT_LIVINGROOM,
+ EAX_ENVIRONMENT_STONEROOM,
+ EAX_ENVIRONMENT_AUDITORIUM,
+ EAX_ENVIRONMENT_CONCERTHALL,
+ EAX_ENVIRONMENT_CAVE,
+ EAX_ENVIRONMENT_ARENA,
+ EAX_ENVIRONMENT_HANGAR,
+ EAX_ENVIRONMENT_CARPETEDHALLWAY,
+ EAX_ENVIRONMENT_HALLWAY,
+ EAX_ENVIRONMENT_STONECORRIDOR,
+ EAX_ENVIRONMENT_ALLEY,
+ EAX_ENVIRONMENT_FOREST,
+ EAX_ENVIRONMENT_CITY,
+ EAX_ENVIRONMENT_MOUNTAINS,
+ EAX_ENVIRONMENT_QUARRY,
+ EAX_ENVIRONMENT_PLAIN,
+ EAX_ENVIRONMENT_PARKINGLOT,
+ EAX_ENVIRONMENT_SEWERPIPE,
+ EAX_ENVIRONMENT_UNDERWATER,
+ EAX_ENVIRONMENT_DRUGGED,
+ EAX_ENVIRONMENT_DIZZY,
+ EAX_ENVIRONMENT_PSYCHOTIC,
+
+ EAX_ENVIRONMENT_COUNT // total number of environments
+};
+
+// EAX presets, usage: BASS_SetEAXParameters(EAX_PRESET_xxx)
+#define EAX_PRESET_GENERIC EAX_ENVIRONMENT_GENERIC, 0.5F, 1.493F, 0.5F
+#define EAX_PRESET_PADDEDCELL EAX_ENVIRONMENT_PADDEDCELL, 0.25F, 0.1F, 0.0F
+#define EAX_PRESET_ROOM EAX_ENVIRONMENT_ROOM, 0.417F, 0.4F, 0.666F
+#define EAX_PRESET_BATHROOM EAX_ENVIRONMENT_BATHROOM, 0.653F, 1.499F, 0.166F
+#define EAX_PRESET_LIVINGROOM EAX_ENVIRONMENT_LIVINGROOM, 0.208F, 0.478F, 0.0F
+#define EAX_PRESET_STONEROOM EAX_ENVIRONMENT_STONEROOM, 0.5F, 2.309F, 0.888F
+#define EAX_PRESET_AUDITORIUM EAX_ENVIRONMENT_AUDITORIUM, 0.403F, 4.279F, 0.5F
+#define EAX_PRESET_CONCERTHALL EAX_ENVIRONMENT_CONCERTHALL, 0.5F, 3.961F, 0.5F
+#define EAX_PRESET_CAVE EAX_ENVIRONMENT_CAVE, 0.5F, 2.886F, 1.304F
+#define EAX_PRESET_ARENA EAX_ENVIRONMENT_ARENA, 0.361F, 7.284F, 0.332F
+#define EAX_PRESET_HANGAR EAX_ENVIRONMENT_HANGAR, 0.5F, 10.0F, 0.3F
+#define EAX_PRESET_CARPETEDHALLWAY \
+ EAX_ENVIRONMENT_CARPETEDHALLWAY, 0.153F, 0.259F, 2.0F
+#define EAX_PRESET_HALLWAY EAX_ENVIRONMENT_HALLWAY, 0.361F, 1.493F, 0.0F
+#define EAX_PRESET_STONECORRIDOR \
+ EAX_ENVIRONMENT_STONECORRIDOR, 0.444F, 2.697F, 0.638F
+#define EAX_PRESET_ALLEY EAX_ENVIRONMENT_ALLEY, 0.25F, 1.752F, 0.776F
+#define EAX_PRESET_FOREST EAX_ENVIRONMENT_FOREST, 0.111F, 3.145F, 0.472F
+#define EAX_PRESET_CITY EAX_ENVIRONMENT_CITY, 0.111F, 2.767F, 0.224F
+#define EAX_PRESET_MOUNTAINS EAX_ENVIRONMENT_MOUNTAINS, 0.194F, 7.841F, 0.472F
+#define EAX_PRESET_QUARRY EAX_ENVIRONMENT_QUARRY, 1.0F, 1.499F, 0.5F
+#define EAX_PRESET_PLAIN EAX_ENVIRONMENT_PLAIN, 0.097F, 2.767F, 0.224F
+#define EAX_PRESET_PARKINGLOT EAX_ENVIRONMENT_PARKINGLOT, 0.208F, 1.652F, 1.5F
+#define EAX_PRESET_SEWERPIPE EAX_ENVIRONMENT_SEWERPIPE, 0.652F, 2.886F, 0.25F
+#define EAX_PRESET_UNDERWATER EAX_ENVIRONMENT_UNDERWATER, 1.0F, 1.499F, 0.0F
+#define EAX_PRESET_DRUGGED EAX_ENVIRONMENT_DRUGGED, 0.875F, 8.392F, 1.388F
+#define EAX_PRESET_DIZZY EAX_ENVIRONMENT_DIZZY, 0.139F, 17.234F, 0.666F
+#define EAX_PRESET_PSYCHOTIC EAX_ENVIRONMENT_PSYCHOTIC, 0.486F, 7.563F, 0.806F
+
+typedef DWORD(CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length,
+ void *user);
+/* User stream callback function. NOTE: A stream function should obviously be as
+quick as possible, other streams (and MOD musics) can't be mixed until it's
+finished. handle : The stream that needs writing buffer : Buffer to write the
+samples in length : Number of bytes to write user : The 'user' parameter value
+given when calling BASS_StreamCreate RETURN : Number of bytes written. Set the
+BASS_STREAMPROC_END flag to end the stream. */
+
+#define BASS_STREAMPROC_END 0x80000000 // end of user stream flag
+
+// special STREAMPROCs
+#define STREAMPROC_DUMMY (STREAMPROC *)0 // "dummy" stream
+#define STREAMPROC_PUSH (STREAMPROC *)-1 // push stream
+#define STREAMPROC_DEVICE (STREAMPROC *)-2 // device mix stream
+#define STREAMPROC_DEVICE_3D (STREAMPROC *)-3 // device 3D mix stream
+
+// BASS_StreamCreateFileUser file systems
+#define STREAMFILE_NOBUFFER 0
+#define STREAMFILE_BUFFER 1
+#define STREAMFILE_BUFFERPUSH 2
+
+// User file stream callback functions
+typedef void(CALLBACK FILECLOSEPROC)(void *user);
+typedef QWORD(CALLBACK FILELENPROC)(void *user);
+typedef DWORD(CALLBACK FILEREADPROC)(void *buffer, DWORD length, void *user);
+typedef BOOL(CALLBACK FILESEEKPROC)(QWORD offset, void *user);
+
+typedef struct {
+ FILECLOSEPROC *close;
+ FILELENPROC *length;
+ FILEREADPROC *read;
+ FILESEEKPROC *seek;
+} BASS_FILEPROCS;
+
+// BASS_StreamPutFileData options
+#define BASS_FILEDATA_END 0 // end & close the file
+
+// BASS_StreamGetFilePosition modes
+#define BASS_FILEPOS_CURRENT 0
+#define BASS_FILEPOS_DECODE BASS_FILEPOS_CURRENT
+#define BASS_FILEPOS_DOWNLOAD 1
+#define BASS_FILEPOS_END 2
+#define BASS_FILEPOS_START 3
+#define BASS_FILEPOS_CONNECTED 4
+#define BASS_FILEPOS_BUFFER 5
+#define BASS_FILEPOS_SOCKET 6
+#define BASS_FILEPOS_ASYNCBUF 7
+#define BASS_FILEPOS_SIZE 8
+#define BASS_FILEPOS_BUFFERING 9
+
+typedef void(CALLBACK DOWNLOADPROC)(const void *buffer, DWORD length,
+ void *user);
+/* Internet stream download callback function.
+buffer : Buffer containing the downloaded data... NULL=end of download
+length : Number of bytes in the buffer
+user : The 'user' parameter value given when calling BASS_StreamCreateURL */
+
+// BASS_ChannelSetSync types
+#define BASS_SYNC_POS 0
+#define BASS_SYNC_END 2
+#define BASS_SYNC_META 4
+#define BASS_SYNC_SLIDE 5
+#define BASS_SYNC_STALL 6
+#define BASS_SYNC_DOWNLOAD 7
+#define BASS_SYNC_FREE 8
+#define BASS_SYNC_SETPOS 11
+#define BASS_SYNC_MUSICPOS 10
+#define BASS_SYNC_MUSICINST 1
+#define BASS_SYNC_MUSICFX 3
+#define BASS_SYNC_OGG_CHANGE 12
+#define BASS_SYNC_DEV_FAIL 14
+#define BASS_SYNC_DEV_FORMAT 15
+#define BASS_SYNC_MIXTIME 0x40000000 // flag: sync at mixtime, else at playtime
+#define BASS_SYNC_ONETIME 0x80000000 // flag: sync only once, else continuously
+
+typedef void(CALLBACK SYNCPROC)(HSYNC handle, DWORD channel, DWORD data,
+ void *user);
+/* Sync callback function. NOTE: a sync callback function should be very
+quick as other syncs can't be processed until it has finished. If the sync
+is a "mixtime" sync, then other streams and MOD musics can't be mixed until
+it's finished either.
+handle : The sync that has occured
+channel: Channel that the sync occured in
+data : Additional data associated with the sync's occurance
+user : The 'user' parameter given when calling BASS_ChannelSetSync */
+
+typedef void(CALLBACK DSPPROC)(HDSP handle, DWORD channel, void *buffer,
+ DWORD length, void *user);
+/* DSP callback function. NOTE: A DSP function should obviously be as quick as
+possible... other DSP functions, streams and MOD musics can not be processed
+until it's finished.
+handle : The DSP handle
+channel: Channel that the DSP is being applied to
+buffer : Buffer to apply the DSP to
+length : Number of bytes in the buffer
+user : The 'user' parameter given when calling BASS_ChannelSetDSP */
+
+typedef BOOL(CALLBACK RECORDPROC)(HRECORD handle, const void *buffer,
+ DWORD length, void *user);
+/* Recording callback function.
+handle : The recording handle
+buffer : Buffer containing the recorded sample data
+length : Number of bytes
+user : The 'user' parameter value given when calling BASS_RecordStart
+RETURN : TRUE = continue recording, FALSE = stop */
+
+// BASS_ChannelIsActive return values
+#define BASS_ACTIVE_STOPPED 0
+#define BASS_ACTIVE_PLAYING 1
+#define BASS_ACTIVE_STALLED 2
+#define BASS_ACTIVE_PAUSED 3
+#define BASS_ACTIVE_PAUSED_DEVICE 4
+
+// Channel attributes
+#define BASS_ATTRIB_FREQ 1
+#define BASS_ATTRIB_VOL 2
+#define BASS_ATTRIB_PAN 3
+#define BASS_ATTRIB_EAXMIX 4
+#define BASS_ATTRIB_NOBUFFER 5
+#define BASS_ATTRIB_VBR 6
+#define BASS_ATTRIB_CPU 7
+#define BASS_ATTRIB_SRC 8
+#define BASS_ATTRIB_NET_RESUME 9
+#define BASS_ATTRIB_SCANINFO 10
+#define BASS_ATTRIB_NORAMP 11
+#define BASS_ATTRIB_BITRATE 12
+#define BASS_ATTRIB_BUFFER 13
+#define BASS_ATTRIB_MUSIC_AMPLIFY 0x100
+#define BASS_ATTRIB_MUSIC_PANSEP 0x101
+#define BASS_ATTRIB_MUSIC_PSCALER 0x102
+#define BASS_ATTRIB_MUSIC_BPM 0x103
+#define BASS_ATTRIB_MUSIC_SPEED 0x104
+#define BASS_ATTRIB_MUSIC_VOL_GLOBAL 0x105
+#define BASS_ATTRIB_MUSIC_ACTIVE 0x106
+#define BASS_ATTRIB_MUSIC_VOL_CHAN 0x200 // + channel #
+#define BASS_ATTRIB_MUSIC_VOL_INST 0x300 // + instrument #
+
+// BASS_ChannelSlideAttribute flags
+#define BASS_SLIDE_LOG 0x1000000
+
+// BASS_ChannelGetData flags
+#define BASS_DATA_AVAILABLE 0 // query how much data is buffered
+#define BASS_DATA_FIXED 0x20000000 // flag: return 8.24 fixed-point data
+#define BASS_DATA_FLOAT 0x40000000 // flag: return floating-point sample data
+#define BASS_DATA_FFT256 0x80000000 // 256 sample FFT
+#define BASS_DATA_FFT512 0x80000001 // 512 FFT
+#define BASS_DATA_FFT1024 0x80000002 // 1024 FFT
+#define BASS_DATA_FFT2048 0x80000003 // 2048 FFT
+#define BASS_DATA_FFT4096 0x80000004 // 4096 FFT
+#define BASS_DATA_FFT8192 0x80000005 // 8192 FFT
+#define BASS_DATA_FFT16384 0x80000006 // 16384 FFT
+#define BASS_DATA_FFT32768 0x80000007 // 32768 FFT
+#define BASS_DATA_FFT_INDIVIDUAL \
+ 0x10 // FFT flag: FFT for each channel, else all combined
+#define BASS_DATA_FFT_NOWINDOW 0x20 // FFT flag: no Hanning window
+#define BASS_DATA_FFT_REMOVEDC 0x40 // FFT flag: pre-remove DC bias
+#define BASS_DATA_FFT_COMPLEX 0x80 // FFT flag: return complex data
+#define BASS_DATA_FFT_NYQUIST 0x100 // FFT flag: return extra Nyquist value
+
+// BASS_ChannelGetLevelEx flags
+#define BASS_LEVEL_MONO 1
+#define BASS_LEVEL_STEREO 2
+#define BASS_LEVEL_RMS 4
+#define BASS_LEVEL_VOLPAN 8
+
+// BASS_ChannelGetTags types : what's returned
+#define BASS_TAG_ID3 0 // ID3v1 tags : TAG_ID3 structure
+#define BASS_TAG_ID3V2 1 // ID3v2 tags : variable length block
+#define BASS_TAG_OGG 2 // OGG comments : series of null-terminated UTF-8 strings
+#define BASS_TAG_HTTP 3 // HTTP headers : series of null-terminated ANSI strings
+#define BASS_TAG_ICY 4 // ICY headers : series of null-terminated ANSI strings
+#define BASS_TAG_META 5 // ICY metadata : ANSI string
+#define BASS_TAG_APE 6 // APE tags : series of null-terminated UTF-8 strings
+#define BASS_TAG_MP4 \
+ 7 // MP4/iTunes metadata : series of null-terminated UTF-8 strings
+#define BASS_TAG_WMA 8 // WMA tags : series of null-terminated UTF-8 strings
+#define BASS_TAG_VENDOR 9 // OGG encoder : UTF-8 string
+#define BASS_TAG_LYRICS3 10 // Lyric3v2 tag : ASCII string
+#define BASS_TAG_CA_CODEC 11 // CoreAudio codec info : TAG_CA_CODEC structure
+#define BASS_TAG_MF \
+ 13 // Media Foundation tags : series of null-terminated UTF-8 strings
+#define BASS_TAG_WAVEFORMAT 14 // WAVE format : WAVEFORMATEEX structure
+#define BASS_TAG_AM_MIME 15 // Android Media MIME type : ASCII string
+#define BASS_TAG_AM_NAME 16 // Android Media codec name : ASCII string
+#define BASS_TAG_RIFF_INFO \
+ 0x100 // RIFF "INFO" tags : series of null-terminated ANSI strings
+#define BASS_TAG_RIFF_BEXT 0x101 // RIFF/BWF "bext" tags : TAG_BEXT structure
+#define BASS_TAG_RIFF_CART 0x102 // RIFF/BWF "cart" tags : TAG_CART structure
+#define BASS_TAG_RIFF_DISP 0x103 // RIFF "DISP" text tag : ANSI string
+#define BASS_TAG_RIFF_CUE 0x104 // RIFF "cue " chunk : TAG_CUE structure
+#define BASS_TAG_RIFF_SMPL 0x105 // RIFF "smpl" chunk : TAG_SMPL structure
+#define BASS_TAG_APE_BINARY \
+ 0x1000 // + index #, binary APE tag : TAG_APE_BINARY structure
+#define BASS_TAG_MUSIC_NAME 0x10000 // MOD music name : ANSI string
+#define BASS_TAG_MUSIC_MESSAGE 0x10001 // MOD message : ANSI string
+#define BASS_TAG_MUSIC_ORDERS \
+ 0x10002 // MOD order list : BYTE array of pattern numbers
+#define BASS_TAG_MUSIC_AUTH 0x10003 // MOD author : UTF-8 string
+#define BASS_TAG_MUSIC_INST \
+ 0x10100 // + instrument #, MOD instrument name : ANSI string
+#define BASS_TAG_MUSIC_SAMPLE \
+ 0x10300 // + sample #, MOD sample name : ANSI string
+
+// ID3v1 tag structure
+typedef struct {
+ char id[3];
+ char title[30];
+ char artist[30];
+ char album[30];
+ char year[4];
+ char comment[30];
+ BYTE genre;
+} TAG_ID3;
+
+// Binary APE tag structure
+typedef struct {
+ const char *key;
+ const void *data;
+ DWORD length;
+} TAG_APE_BINARY;
+
+// BWF "bext" tag structure
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4200)
+#endif
+#pragma pack(push, 1)
+typedef struct {
+ char Description[256]; // description
+ char Originator[32]; // name of the originator
+ char OriginatorReference[32]; // reference of the originator
+ char OriginationDate[10]; // date of creation (yyyy-mm-dd)
+ char OriginationTime[8]; // time of creation (hh-mm-ss)
+ QWORD TimeReference; // first sample count since midnight (little-endian)
+ WORD Version; // BWF version (little-endian)
+ BYTE UMID[64]; // SMPTE UMID
+ BYTE Reserved[190];
+#if defined(__GNUC__) && __GNUC__ < 3
+ char CodingHistory[0]; // history
+#elif 1 // change to 0 if compiler fails the following line
+ char CodingHistory[]; // history
+#else
+ char CodingHistory[1]; // history
+#endif
+} TAG_BEXT;
+#pragma pack(pop)
+
+// BWF "cart" tag structures
+typedef struct {
+ DWORD dwUsage; // FOURCC timer usage ID
+ DWORD dwValue; // timer value in samples from head
+} TAG_CART_TIMER;
+
+typedef struct {
+ char Version[4]; // version of the data structure
+ char Title[64]; // title of cart audio sequence
+ char Artist[64]; // artist or creator name
+ char CutID[64]; // cut number identification
+ char ClientID[64]; // client identification
+ char Category[64]; // category ID, PSA, NEWS, etc
+ char Classification[64]; // classification or auxiliary key
+ char OutCue[64]; // out cue text
+ char StartDate[10]; // yyyy-mm-dd
+ char StartTime[8]; // hh:mm:ss
+ char EndDate[10]; // yyyy-mm-dd
+ char EndTime[8]; // hh:mm:ss
+ char ProducerAppID[64]; // name of vendor or application
+ char ProducerAppVersion[64]; // version of producer application
+ char UserDef[64]; // user defined text
+ DWORD dwLevelReference; // sample value for 0 dB reference
+ TAG_CART_TIMER PostTimer[8]; // 8 time markers after head
+ char Reserved[276];
+ char URL[1024]; // uniform resource locator
+#if defined(__GNUC__) && __GNUC__ < 3
+ char TagText[0]; // free form text for scripts or tags
+#elif 1 // change to 0 if compiler fails the following line
+ char TagText[]; // free form text for scripts or tags
+#else
+ char TagText[1]; // free form text for scripts or tags
+#endif
+} TAG_CART;
+
+// RIFF "cue " tag structures
+typedef struct {
+ DWORD dwName;
+ DWORD dwPosition;
+ DWORD fccChunk;
+ DWORD dwChunkStart;
+ DWORD dwBlockStart;
+ DWORD dwSampleOffset;
+} TAG_CUE_POINT;
+
+typedef struct {
+ DWORD dwCuePoints;
+#if defined(__GNUC__) && __GNUC__ < 3
+ TAG_CUE_POINT CuePoints[0];
+#elif 1 // change to 0 if compiler fails the following line
+ TAG_CUE_POINT CuePoints[];
+#else
+ TAG_CUE_POINT CuePoints[1];
+#endif
+} TAG_CUE;
+
+// RIFF "smpl" tag structures
+typedef struct {
+ DWORD dwIdentifier;
+ DWORD dwType;
+ DWORD dwStart;
+ DWORD dwEnd;
+ DWORD dwFraction;
+ DWORD dwPlayCount;
+} TAG_SMPL_LOOP;
+
+typedef struct {
+ DWORD dwManufacturer;
+ DWORD dwProduct;
+ DWORD dwSamplePeriod;
+ DWORD dwMIDIUnityNote;
+ DWORD dwMIDIPitchFraction;
+ DWORD dwSMPTEFormat;
+ DWORD dwSMPTEOffset;
+ DWORD cSampleLoops;
+ DWORD cbSamplerData;
+#if defined(__GNUC__) && __GNUC__ < 3
+ TAG_SMPL_LOOP SampleLoops[0];
+#elif 1 // change to 0 if compiler fails the following line
+ TAG_SMPL_LOOP SampleLoops[];
+#else
+ TAG_SMPL_LOOP SampleLoops[1];
+#endif
+} TAG_SMPL;
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+// CoreAudio codec info structure
+typedef struct {
+ DWORD ftype; // file format
+ DWORD atype; // audio format
+ const char *name; // description
+} TAG_CA_CODEC;
+
+#ifndef _WAVEFORMATEX_
+#define _WAVEFORMATEX_
+#pragma pack(push, 1)
+typedef struct tWAVEFORMATEX {
+ WORD wFormatTag;
+ WORD nChannels;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ WORD nBlockAlign;
+ WORD wBitsPerSample;
+ WORD cbSize;
+} WAVEFORMATEX, *PWAVEFORMATEX, *LPWAVEFORMATEX;
+typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
+#pragma pack(pop)
+#endif
+
+// BASS_ChannelGetLength/GetPosition/SetPosition modes
+#define BASS_POS_BYTE 0 // byte position
+#define BASS_POS_MUSIC_ORDER 1 // order.row position, MAKELONG(order,row)
+#define BASS_POS_OGG 3 // OGG bitstream number
+#define BASS_POS_RESET 0x2000000 // flag: reset user file buffers
+#define BASS_POS_RELATIVE \
+ 0x4000000 // flag: seek relative to the current position
+#define BASS_POS_INEXACT 0x8000000 // flag: allow seeking to inexact position
+#define BASS_POS_DECODE \
+ 0x10000000 // flag: get the decoding (not playing) position
+#define BASS_POS_DECODETO \
+ 0x20000000 // flag: decode to the position instead of seeking
+#define BASS_POS_SCAN 0x40000000 // flag: scan to the position
+
+// BASS_ChannelSetDevice/GetDevice option
+#define BASS_NODEVICE 0x20000
+
+// BASS_RecordSetInput flags
+#define BASS_INPUT_OFF 0x10000
+#define BASS_INPUT_ON 0x20000
+
+#define BASS_INPUT_TYPE_MASK 0xff000000
+#define BASS_INPUT_TYPE_UNDEF 0x00000000
+#define BASS_INPUT_TYPE_DIGITAL 0x01000000
+#define BASS_INPUT_TYPE_LINE 0x02000000
+#define BASS_INPUT_TYPE_MIC 0x03000000
+#define BASS_INPUT_TYPE_SYNTH 0x04000000
+#define BASS_INPUT_TYPE_CD 0x05000000
+#define BASS_INPUT_TYPE_PHONE 0x06000000
+#define BASS_INPUT_TYPE_SPEAKER 0x07000000
+#define BASS_INPUT_TYPE_WAVE 0x08000000
+#define BASS_INPUT_TYPE_AUX 0x09000000
+#define BASS_INPUT_TYPE_ANALOG 0x0a000000
+
+// BASS_ChannelSetFX effect types
+#define BASS_FX_DX8_CHORUS 0
+#define BASS_FX_DX8_COMPRESSOR 1
+#define BASS_FX_DX8_DISTORTION 2
+#define BASS_FX_DX8_ECHO 3
+#define BASS_FX_DX8_FLANGER 4
+#define BASS_FX_DX8_GARGLE 5
+#define BASS_FX_DX8_I3DL2REVERB 6
+#define BASS_FX_DX8_PARAMEQ 7
+#define BASS_FX_DX8_REVERB 8
+#define BASS_FX_VOLUME 9
+
+typedef struct {
+ float fWetDryMix;
+ float fDepth;
+ float fFeedback;
+ float fFrequency;
+ DWORD lWaveform; // 0=triangle, 1=sine
+ float fDelay;
+ DWORD lPhase; // BASS_DX8_PHASE_xxx
+} BASS_DX8_CHORUS;
+
+typedef struct {
+ float fGain;
+ float fAttack;
+ float fRelease;
+ float fThreshold;
+ float fRatio;
+ float fPredelay;
+} BASS_DX8_COMPRESSOR;
+
+typedef struct {
+ float fGain;
+ float fEdge;
+ float fPostEQCenterFrequency;
+ float fPostEQBandwidth;
+ float fPreLowpassCutoff;
+} BASS_DX8_DISTORTION;
+
+typedef struct {
+ float fWetDryMix;
+ float fFeedback;
+ float fLeftDelay;
+ float fRightDelay;
+ BOOL lPanDelay;
+} BASS_DX8_ECHO;
+
+typedef struct {
+ float fWetDryMix;
+ float fDepth;
+ float fFeedback;
+ float fFrequency;
+ DWORD lWaveform; // 0=triangle, 1=sine
+ float fDelay;
+ DWORD lPhase; // BASS_DX8_PHASE_xxx
+} BASS_DX8_FLANGER;
+
+typedef struct {
+ DWORD dwRateHz; // Rate of modulation in hz
+ DWORD dwWaveShape; // 0=triangle, 1=square
+} BASS_DX8_GARGLE;
+
+typedef struct {
+ int lRoom; // [-10000, 0] default: -1000 mB
+ int lRoomHF; // [-10000, 0] default: 0 mB
+ float flRoomRolloffFactor; // [0.0, 10.0] default: 0.0
+ float flDecayTime; // [0.1, 20.0] default: 1.49s
+ float flDecayHFRatio; // [0.1, 2.0] default: 0.83
+ int lReflections; // [-10000, 1000] default: -2602 mB
+ float flReflectionsDelay; // [0.0, 0.3] default: 0.007 s
+ int lReverb; // [-10000, 2000] default: 200 mB
+ float flReverbDelay; // [0.0, 0.1] default: 0.011 s
+ float flDiffusion; // [0.0, 100.0] default: 100.0 %
+ float flDensity; // [0.0, 100.0] default: 100.0 %
+ float flHFReference; // [20.0, 20000.0] default: 5000.0 Hz
+} BASS_DX8_I3DL2REVERB;
+
+typedef struct {
+ float fCenter;
+ float fBandwidth;
+ float fGain;
+} BASS_DX8_PARAMEQ;
+
+typedef struct {
+ float fInGain; // [-96.0,0.0] default: 0.0 dB
+ float fReverbMix; // [-96.0,0.0] default: 0.0 db
+ float fReverbTime; // [0.001,3000.0] default: 1000.0 ms
+ float fHighFreqRTRatio; // [0.001,0.999] default: 0.001
+} BASS_DX8_REVERB;
+
+#define BASS_DX8_PHASE_NEG_180 0
+#define BASS_DX8_PHASE_NEG_90 1
+#define BASS_DX8_PHASE_ZERO 2
+#define BASS_DX8_PHASE_90 3
+#define BASS_DX8_PHASE_180 4
+
+typedef struct {
+ float fTarget;
+ float fCurrent;
+ float fTime;
+ DWORD lCurve;
+} BASS_FX_VOLUME_PARAM;
+
+typedef void(CALLBACK IOSNOTIFYPROC)(DWORD status);
+/* iOS notification callback function.
+status : The notification (BASS_IOSNOTIFY_xxx) */
+
+#define BASS_IOSNOTIFY_INTERRUPT 1 // interruption started
+#define BASS_IOSNOTIFY_INTERRUPT_END 2 // interruption ended
+
+BOOL BASSDEF(BASS_SetConfig)(DWORD option, DWORD value);
+DWORD BASSDEF(BASS_GetConfig)(DWORD option);
+BOOL BASSDEF(BASS_SetConfigPtr)(DWORD option, const void *value);
+void *BASSDEF(BASS_GetConfigPtr)(DWORD option);
+DWORD BASSDEF(BASS_GetVersion)();
+int BASSDEF(BASS_ErrorGetCode)();
+BOOL BASSDEF(BASS_GetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info);
+#if defined(_WIN32) && !defined(_WIN32_WCE) && \
+ !(WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
+BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, HWND win,
+ const GUID *dsguid);
+#else
+BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, void *win,
+ void *dsguid);
+#endif
+BOOL BASSDEF(BASS_SetDevice)(DWORD device);
+DWORD BASSDEF(BASS_GetDevice)();
+BOOL BASSDEF(BASS_Free)();
+#if defined(_WIN32) && !defined(_WIN32_WCE) && \
+ !(WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
+void *BASSDEF(BASS_GetDSoundObject)(DWORD object);
+#endif
+BOOL BASSDEF(BASS_GetInfo)(BASS_INFO *info);
+BOOL BASSDEF(BASS_Update)(DWORD length);
+float BASSDEF(BASS_GetCPU)();
+BOOL BASSDEF(BASS_Start)();
+BOOL BASSDEF(BASS_Stop)();
+BOOL BASSDEF(BASS_Pause)();
+BOOL BASSDEF(BASS_IsStarted)();
+BOOL BASSDEF(BASS_SetVolume)(float volume);
+float BASSDEF(BASS_GetVolume)();
+
+HPLUGIN BASSDEF(BASS_PluginLoad)(const char *file, DWORD flags);
+BOOL BASSDEF(BASS_PluginFree)(HPLUGIN handle);
+const BASS_PLUGININFO *BASSDEF(BASS_PluginGetInfo)(HPLUGIN handle);
+
+BOOL BASSDEF(BASS_Set3DFactors)(float distf, float rollf, float doppf);
+BOOL BASSDEF(BASS_Get3DFactors)(float *distf, float *rollf, float *doppf);
+BOOL BASSDEF(BASS_Set3DPosition)(const BASS_3DVECTOR *pos,
+ const BASS_3DVECTOR *vel,
+ const BASS_3DVECTOR *front,
+ const BASS_3DVECTOR *top);
+BOOL BASSDEF(BASS_Get3DPosition)(BASS_3DVECTOR *pos, BASS_3DVECTOR *vel,
+ BASS_3DVECTOR *front, BASS_3DVECTOR *top);
+void BASSDEF(BASS_Apply3D)();
+#if defined(_WIN32) && !defined(_WIN32_WCE) && \
+ !(WINAPI_FAMILY && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
+BOOL BASSDEF(BASS_SetEAXParameters)(int env, float vol, float decay,
+ float damp);
+BOOL BASSDEF(BASS_GetEAXParameters)(DWORD *env, float *vol, float *decay,
+ float *damp);
+#endif
+
+HMUSIC BASSDEF(BASS_MusicLoad)(BOOL mem, const void *file, QWORD offset,
+ DWORD length, DWORD flags, DWORD freq);
+BOOL BASSDEF(BASS_MusicFree)(HMUSIC handle);
+
+HSAMPLE BASSDEF(BASS_SampleLoad)(BOOL mem, const void *file, QWORD offset,
+ DWORD length, DWORD max, DWORD flags);
+HSAMPLE BASSDEF(BASS_SampleCreate)(DWORD length, DWORD freq, DWORD chans,
+ DWORD max, DWORD flags);
+BOOL BASSDEF(BASS_SampleFree)(HSAMPLE handle);
+BOOL BASSDEF(BASS_SampleSetData)(HSAMPLE handle, const void *buffer);
+BOOL BASSDEF(BASS_SampleGetData)(HSAMPLE handle, void *buffer);
+BOOL BASSDEF(BASS_SampleGetInfo)(HSAMPLE handle, BASS_SAMPLE *info);
+BOOL BASSDEF(BASS_SampleSetInfo)(HSAMPLE handle, const BASS_SAMPLE *info);
+HCHANNEL BASSDEF(BASS_SampleGetChannel)(HSAMPLE handle, BOOL onlynew);
+DWORD BASSDEF(BASS_SampleGetChannels)(HSAMPLE handle, HCHANNEL *channels);
+BOOL BASSDEF(BASS_SampleStop)(HSAMPLE handle);
+
+HSTREAM BASSDEF(BASS_StreamCreate)(DWORD freq, DWORD chans, DWORD flags,
+ STREAMPROC *proc, void *user);
+HSTREAM BASSDEF(BASS_StreamCreateFile)(BOOL mem, const void *file, QWORD offset,
+ QWORD length, DWORD flags);
+HSTREAM BASSDEF(BASS_StreamCreateURL)(const char *url, DWORD offset,
+ DWORD flags, DOWNLOADPROC *proc,
+ void *user);
+HSTREAM BASSDEF(BASS_StreamCreateFileUser)(DWORD system, DWORD flags,
+ const BASS_FILEPROCS *proc,
+ void *user);
+BOOL BASSDEF(BASS_StreamFree)(HSTREAM handle);
+QWORD BASSDEF(BASS_StreamGetFilePosition)(HSTREAM handle, DWORD mode);
+DWORD BASSDEF(BASS_StreamPutData)(HSTREAM handle, const void *buffer,
+ DWORD length);
+DWORD BASSDEF(BASS_StreamPutFileData)(HSTREAM handle, const void *buffer,
+ DWORD length);
+
+BOOL BASSDEF(BASS_RecordGetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info);
+BOOL BASSDEF(BASS_RecordInit)(int device);
+BOOL BASSDEF(BASS_RecordSetDevice)(DWORD device);
+DWORD BASSDEF(BASS_RecordGetDevice)();
+BOOL BASSDEF(BASS_RecordFree)();
+BOOL BASSDEF(BASS_RecordGetInfo)(BASS_RECORDINFO *info);
+const char *BASSDEF(BASS_RecordGetInputName)(int input);
+BOOL BASSDEF(BASS_RecordSetInput)(int input, DWORD flags, float volume);
+DWORD BASSDEF(BASS_RecordGetInput)(int input, float *volume);
+HRECORD BASSDEF(BASS_RecordStart)(DWORD freq, DWORD chans, DWORD flags,
+ RECORDPROC *proc, void *user);
+
+double BASSDEF(BASS_ChannelBytes2Seconds)(DWORD handle, QWORD pos);
+QWORD BASSDEF(BASS_ChannelSeconds2Bytes)(DWORD handle, double pos);
+DWORD BASSDEF(BASS_ChannelGetDevice)(DWORD handle);
+BOOL BASSDEF(BASS_ChannelSetDevice)(DWORD handle, DWORD device);
+DWORD BASSDEF(BASS_ChannelIsActive)(DWORD handle);
+BOOL BASSDEF(BASS_ChannelGetInfo)(DWORD handle, BASS_CHANNELINFO *info);
+const char *BASSDEF(BASS_ChannelGetTags)(DWORD handle, DWORD tags);
+DWORD BASSDEF(BASS_ChannelFlags)(DWORD handle, DWORD flags, DWORD mask);
+BOOL BASSDEF(BASS_ChannelUpdate)(DWORD handle, DWORD length);
+BOOL BASSDEF(BASS_ChannelLock)(DWORD handle, BOOL lock);
+BOOL BASSDEF(BASS_ChannelPlay)(DWORD handle, BOOL restart);
+BOOL BASSDEF(BASS_ChannelStop)(DWORD handle);
+BOOL BASSDEF(BASS_ChannelPause)(DWORD handle);
+BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value);
+BOOL BASSDEF(BASS_ChannelGetAttribute)(DWORD handle, DWORD attrib,
+ float *value);
+BOOL BASSDEF(BASS_ChannelSlideAttribute)(DWORD handle, DWORD attrib,
+ float value, DWORD time);
+BOOL BASSDEF(BASS_ChannelIsSliding)(DWORD handle, DWORD attrib);
+BOOL BASSDEF(BASS_ChannelSetAttributeEx)(DWORD handle, DWORD attrib,
+ void *value, DWORD size);
+DWORD BASSDEF(BASS_ChannelGetAttributeEx)(DWORD handle, DWORD attrib,
+ void *value, DWORD size);
+BOOL BASSDEF(BASS_ChannelSet3DAttributes)(DWORD handle, int mode, float min,
+ float max, int iangle, int oangle,
+ float outvol);
+BOOL BASSDEF(BASS_ChannelGet3DAttributes)(DWORD handle, DWORD *mode, float *min,
+ float *max, DWORD *iangle,
+ DWORD *oangle, float *outvol);
+BOOL BASSDEF(BASS_ChannelSet3DPosition)(DWORD handle, const BASS_3DVECTOR *pos,
+ const BASS_3DVECTOR *orient,
+ const BASS_3DVECTOR *vel);
+BOOL BASSDEF(BASS_ChannelGet3DPosition)(DWORD handle, BASS_3DVECTOR *pos,
+ BASS_3DVECTOR *orient,
+ BASS_3DVECTOR *vel);
+QWORD BASSDEF(BASS_ChannelGetLength)(DWORD handle, DWORD mode);
+BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode);
+QWORD BASSDEF(BASS_ChannelGetPosition)(DWORD handle, DWORD mode);
+DWORD BASSDEF(BASS_ChannelGetLevel)(DWORD handle);
+BOOL BASSDEF(BASS_ChannelGetLevelEx)(DWORD handle, float *levels, float length,
+ DWORD flags);
+DWORD BASSDEF(BASS_ChannelGetData)(DWORD handle, void *buffer, DWORD length);
+HSYNC BASSDEF(BASS_ChannelSetSync)(DWORD handle, DWORD type, QWORD param,
+ SYNCPROC *proc, void *user);
+BOOL BASSDEF(BASS_ChannelRemoveSync)(DWORD handle, HSYNC sync);
+HDSP BASSDEF(BASS_ChannelSetDSP)(DWORD handle, DSPPROC *proc, void *user,
+ int priority);
+BOOL BASSDEF(BASS_ChannelRemoveDSP)(DWORD handle, HDSP dsp);
+BOOL BASSDEF(BASS_ChannelSetLink)(DWORD handle, DWORD chan);
+BOOL BASSDEF(BASS_ChannelRemoveLink)(DWORD handle, DWORD chan);
+HFX BASSDEF(BASS_ChannelSetFX)(DWORD handle, DWORD type, int priority);
+BOOL BASSDEF(BASS_ChannelRemoveFX)(DWORD handle, HFX fx);
+
+BOOL BASSDEF(BASS_FXSetParameters)(HFX handle, const void *params);
+BOOL BASSDEF(BASS_FXGetParameters)(HFX handle, void *params);
+BOOL BASSDEF(BASS_FXReset)(HFX handle);
+BOOL BASSDEF(BASS_FXSetPriority)(HFX handle, int priority);
+
+#ifdef __cplusplus
+}
+
+#if defined(_WIN32) && !defined(NOBASSOVERLOADS)
+static inline HPLUGIN BASS_PluginLoad(const WCHAR *file, DWORD flags)
+{
+ return BASS_PluginLoad((const char *)file, flags | BASS_UNICODE);
+}
+
+static inline HMUSIC BASS_MusicLoad(BOOL mem, const WCHAR *file, QWORD offset,
+ DWORD length, DWORD flags, DWORD freq)
+{
+ return BASS_MusicLoad(mem, (const void *)file, offset, length,
+ flags | BASS_UNICODE, freq);
+}
+
+static inline HSAMPLE BASS_SampleLoad(BOOL mem, const WCHAR *file, QWORD offset,
+ DWORD length, DWORD max, DWORD flags)
+{
+ return BASS_SampleLoad(mem, (const void *)file, offset, length, max,
+ flags | BASS_UNICODE);
+}
+
+static inline HSTREAM BASS_StreamCreateFile(BOOL mem, const WCHAR *file,
+ QWORD offset, QWORD length,
+ DWORD flags)
+{
+ return BASS_StreamCreateFile(mem, (const void *)file, offset, length,
+ flags | BASS_UNICODE);
+}
+
+static inline HSTREAM BASS_StreamCreateURL(const WCHAR *url, DWORD offset,
+ DWORD flags, DOWNLOADPROC *proc,
+ void *user)
+{
+ return BASS_StreamCreateURL((const char *)url, offset, flags | BASS_UNICODE,
+ proc, user);
+}
+
+static inline BOOL BASS_SetConfigPtr(DWORD option, const WCHAR *value)
+{
+ return BASS_SetConfigPtr(option | BASS_UNICODE, (const void *)value);
+}
+#endif
+#endif
+
+#endif
diff --git a/include/bassopus.h b/include/bassopus.h
new file mode 100644
index 00000000..3d8b131d
--- /dev/null
+++ b/include/bassopus.h
@@ -0,0 +1,64 @@
+/*
+ BASSOPUS 2.4 C/C++ header file
+ Copyright (c) 2012-2015 Un4seen Developments Ltd.
+
+ See the BASSOPUS.CHM file for more detailed documentation
+*/
+
+#ifndef BASSOPUS_H
+#define BASSOPUS_H
+
+#include "bass.h"
+
+#if BASSVERSION != 0x204
+#error conflicting BASS and BASSOPUS versions
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef BASSOPUSDEF
+#define BASSOPUSDEF(f) WINAPI f
+#endif
+
+// BASS_CHANNELINFO type
+#define BASS_CTYPE_STREAM_OPUS 0x11200
+
+// Additional attributes
+#define BASS_ATTRIB_OPUS_ORIGFREQ 0x13000
+#define BASS_ATTRIB_OPUS_GAIN 0x13001
+
+HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateFile)(BOOL mem, const void *file,
+ QWORD offset, QWORD length,
+ DWORD flags);
+HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateURL)(const char *url, DWORD offset,
+ DWORD flags, DOWNLOADPROC *proc,
+ void *user);
+HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateFileUser)(DWORD system, DWORD flags,
+ const BASS_FILEPROCS *procs,
+ void *user);
+
+#ifdef __cplusplus
+}
+
+#if defined(_WIN32) && !defined(NOBASSOVERLOADS)
+static inline HSTREAM BASS_OPUS_StreamCreateFile(BOOL mem, const WCHAR *file,
+ QWORD offset, QWORD length,
+ DWORD flags)
+{
+ return BASS_OPUS_StreamCreateFile(mem, (const void *)file, offset, length,
+ flags | BASS_UNICODE);
+}
+
+static inline HSTREAM BASS_OPUS_StreamCreateURL(const WCHAR *url, DWORD offset,
+ DWORD flags, DOWNLOADPROC *proc,
+ void *user)
+{
+ return BASS_OPUS_StreamCreateURL((const char *)url, offset,
+ flags | BASS_UNICODE, proc, user);
+}
+#endif
+#endif
+
+#endif
diff --git a/include/chatlogpiece.h b/include/chatlogpiece.h
index 0232666d..14d4b349 100644
--- a/include/chatlogpiece.h
+++ b/include/chatlogpiece.h
@@ -1,24 +1,26 @@
#ifndef CHATLOGPIECE_H
#define CHATLOGPIECE_H
+#include <QtWidgets/QApplication>
#include <QDateTime>
#include <QString>
class chatlogpiece {
+ Q_DECLARE_TR_FUNCTIONS(chatlogpiece)
public:
chatlogpiece();
chatlogpiece(QString p_name, QString p_showname, QString p_message,
- bool p_song, int color);
+ bool p_song,int color);
chatlogpiece(QString p_name, QString p_showname, QString p_message,
bool p_song, int color, QDateTime p_datetime);
+
QString get_name();
QString get_showname();
QString get_message();
- bool get_is_song();
+ bool is_song();
QDateTime get_datetime();
QString get_datetime_as_string();
int get_chat_color();
-
QString get_full();
private:
@@ -26,8 +28,8 @@ private:
QString showname;
QString message;
QDateTime datetime;
- bool is_song;
int color;
+ bool p_is_song;
};
#endif // CHATLOGPIECE_H
diff --git a/include/courtroom.h b/include/courtroom.h
index 396c4d70..182c2a68 100644
--- a/include/courtroom.h
+++ b/include/courtroom.h
@@ -1,739 +1,810 @@
-#ifndef COURTROOM_H
-#define COURTROOM_H
-
-#include "aoapplication.h"
-#include "aoblipplayer.h"
-#include "aobutton.h"
-#include "aocharbutton.h"
-#include "aocharmovie.h"
-#include "aoemotebutton.h"
-#include "aoevidencebutton.h"
-#include "aoevidencedisplay.h"
-#include "aoimage.h"
-#include "aolineedit.h"
-#include "aomovie.h"
-#include "aomusicplayer.h"
-#include "aooptionsdialog.h"
-#include "aopacket.h"
-#include "aoscene.h"
-#include "aosfxplayer.h"
-#include "aotextarea.h"
-#include "aotextedit.h"
-#include "chatlogpiece.h"
-#include "datatypes.h"
-#include "debug_functions.h"
-#include "file_functions.h"
-#include "hardware_functions.h"
-#include "lobby.h"
-#include <QBrush>
-#include <QCheckBox>
-#include <QCloseEvent>
-#include <QComboBox>
-#include <QDebug>
-#include <QFileDialog>
-#include <QFont>
-#include <QFuture>
-#include <QHeaderView>
-#include <QInputDialog>
-#include <QLayout>
-#include <QLineEdit>
-#include <QListWidget>
-#include <QMainWindow>
-#include <QMap>
-#include <QMenu>
-#include <QMetaObject>
-#include <QMovie>
-#include <QParallelAnimationGroup>
-#include <QPlainTextEdit>
-#include <QPropertyAnimation>
-#include <QRegExp>
-#include <QScrollBar>
-#include <QSignalMapper>
-#include <QSlider>
-#include <QSpinBox>
-#include <QTextBoundaryFinder>
-#include <QTextBrowser>
-#include <QTextCharFormat>
-#include <QThread>
-#include <QThreadPool>
-#include <QTransform>
-#include <QTreeWidget>
-#include <QVector>
-#include <QWidget>
-#include <QtConcurrent/QtConcurrent>
-#include <QtConcurrent/QtConcurrentRun>
-
-#include <stack>
-
-class AOApplication;
-class AOCharMovie;
-class Courtroom : public QMainWindow {
- Q_OBJECT
-public:
- explicit Courtroom(AOApplication *p_ao_app);
-
- void append_char(char_type p_char) { char_list.append(p_char); }
- void append_evidence(evi_type p_evi) { evidence_list.append(p_evi); }
- void append_music(QString f_music) { music_list.append(f_music); }
- void append_area(QString f_area) { area_list.append(f_area); }
- void clear_music() { music_list.clear(); }
- void clear_areas() { area_list.clear(); }
- void handle_failed_login();
- QString threading_sfx = "";
- QString threading_shake = "";
- QString threading_flash = "";
- QString threading_prefix = "";
- // cid and this may differ in cases of ini-editing
- QString current_char = "";
- int current_emote = 0;
- AOApplication *ao_app;
- // abstract widget to hold char buttons
- QWidget *ui_char_buttons;
- QVector<char_type> char_list;
- QVector<evi_type> evidence_list;
- QVector<QString> music_list;
- QVector<QString> area_list;
- QSignalMapper *char_button_mapper;
- QVector<AOCharButton *> ui_char_button_list;
- QVector<AOCharButton *> ui_char_button_list_filtered;
- QLineEdit *ui_char_search;
- QCheckBox *ui_char_passworded;
- QCheckBox *ui_char_taken;
- void mt_pre_framegetter(int frameNumber);
- void mt_framegetter(int frameNumber);
- void reset_music_list() { music_list.clear(); }
-
- void arup_append(int players, QString status, QString cm, QString locked)
- {
- arup_players.append(players);
- arup_statuses.append(status);
- arup_cms.append(cm);
- arup_locks.append(locked);
- }
-
- void arup_modify(int type, int place, QString value)
- {
- if (type == 0) {
- if (arup_players.size() > place)
- arup_players[place] = value.toInt();
- }
- else if (type == 1) {
- if (arup_statuses.size() > place)
- arup_statuses[place] = value;
- }
- else if (type == 2) {
- if (arup_cms.size() > place)
- arup_cms[place] = value;
- }
- else if (type == 3) {
- if (arup_locks.size() > place)
- arup_locks[place] = value;
- }
- list_areas();
- }
-
- void character_loading_finished();
-
- // sets position of widgets based on theme ini files
- void set_widgets();
- // sets font size based on theme ini files
- void set_font(QWidget *widget, QString p_identifier);
- // helper function that calls above function on the relevant widgets
- void set_fonts();
-
- void set_window_title(QString p_title);
- QPoint get_theme_pos(QString p_identifier);
-
- // reads theme inis and sets size and pos based on the identifier
- void set_size_and_pos(QWidget *p_widget, QString p_identifier);
- // sets status as taken on character with cid n_char and places proper shading
- // on charselect
- void set_taken(int n_char, bool p_taken);
-
- // sets the current background to argument. also does some checks to see if
- // it's a legacy bg
- void set_background(QString p_background);
-
- // sets the evidence list member variable to argument
- void set_evidence_list(QVector<evi_type> &p_evi_list);
-
- // called when a DONE#% from the server was received
- void done_received();
-
- // sets the local mute list based on characters available on the server
- void set_mute_list();
-
- // Sets the local pair list based on the characters available on the server.
- void set_pair_list();
-
- // sets desk and bg based on pos in chatmessage
- void set_scene();
-
- // sets text color based on text color in chatmessage
- void set_text_color();
-
- // And gets the colour, too!
- QColor get_text_color(QString color);
-
- // takes in serverD-formatted IP list as prints a converted version to server
- // OOC admittedly poorly named
- void set_ip_list(QString p_list);
-
- // disables chat if current cid matches second argument
- // enables if p_muted is false
- void set_mute(bool p_muted, int p_cid);
-
- // send a message that the player is banned and quits the server
- void set_ban(int p_cid);
-
- // cid = character id, returns the cid of the currently selected character
- int get_cid() { return m_cid; }
- QString get_current_char() { return current_char; }
- QString get_current_background() { return current_background; }
-
- // set the character using an ID
- void set_character(int char_id);
-
- // properly sets up some varibles: resets user state
- void enter_courtroom(int p_cid);
-
- // helper function that populates ui_music_list with the contents of
- // music_list
- void list_music();
- void list_areas();
-
- // these are for OOC chat
- void append_ms_chatmessage(QString f_name, QString f_message);
- void append_server_chatmessage(QString p_name, QString p_message,
- QString p_colour);
-
- // check whether or not current theme has images for buttons with fallback
- // text
- void detect_fallback_text();
-
- // these functions handle chatmessages sequentially.
- // The process itself is very convoluted and merits separate documentation
- // But the general idea is objection animation->pre animation->talking->idle
- void handle_chatmessage(QStringList *p_contents);
- void handle_chatmessage_2();
- void handle_chatmessage_3();
-
- // This function filters out the common CC inline text trickery, for appending
- // to the IC chatlog.
- QString filter_ic_text(QString p_text, bool skip_filter, int chat_color);
-
- // adds text to the IC chatlog. p_name first as bold then p_text then a newlin
- // this function keeps the chatlog scrolled to the top unless there's text
- // selected
- // or the user isn't already scrolled to the top
- void append_ic_text(QString p_text, QString p_name = "",
- bool is_songchange = false, bool force_filter = false,
- bool skip_filter = false, int chat_color = 0);
-
- // prints who played the song to IC chat and plays said song(if found on local
- // filesystem) takes in a list where the first element is the song name and
- // the second is the char id of who played it
- void handle_song(QStringList *p_contents);
-
- void play_preanim(bool noninterrupting);
-
- // plays the witness testimony or cross examination animation based on
- // argument
- void handle_wtce(QString p_wtce, int variant);
-
- // sets the hp bar of defense(p_bar 1) or pro(p_bar 2)
- // state is an number between 0 and 10 inclusive
- void set_hp_bar(int p_bar, int p_state);
-
- // Toggles the judge buttons, whether they should appear or not.
- void toggle_judge_buttons(bool is_on);
- void doScreenShake();
- void doRealization();
-
- void announce_case(QString title, bool def, bool pro, bool jud, bool jur,
- bool steno, bool wit);
-
- void check_connection_received();
-
- void refresh_iclog(bool skiplast);
-
- ~Courtroom();
-
-private:
- int m_courtroom_width = 714;
- int m_courtroom_height = 668;
-
- int m_viewport_x = 0;
- int m_viewport_y = 0;
-
- int m_viewport_width = 256;
- int m_viewport_height = 192;
-
- bool first_message_sent = false;
- int maximumMessages = 0;
- QPropertyAnimation *screenshake_animation;
- QPropertyAnimation *chatbox_screenshake_animation;
- QParallelAnimationGroup *screenshake_group;
- QMovie *frame_emote_checker;
- // This is for inline message-colouring.
-
- enum INLINE_COLOURS { INLINE_BLUE, INLINE_GREEN, INLINE_ORANGE, INLINE_GREY };
-
- // A stack of inline colours.
- std::stack<INLINE_COLOURS> inline_colour_stack;
-
- bool next_character_is_not_special = false; // If true, write the
- // next character as it is.
-
- bool message_is_centered = false;
-
- int current_display_speed = 3;
- int message_display_speed_slow[7] = {30, 40, 50, 60, 75, 100, 120};
- int message_display_speed[7] = {10, 20, 30, 40, 50, 60, 75};
-
- // This is for checking if the character should start talking again
- // when an inline blue text ends.
- bool entire_message_is_blue = false;
-
- // And this is the inline 'talking checker'. Counts how 'deep' we are
- // in inline blues.
- int inline_blue_depth = 0;
-
- // The character ID of the character this user wants to appear alongside with.
- int other_charid = -1;
-
- // The offset this user has given if they want to appear alongside someone.
- int offset_with_pair = 0;
-
- QVector<int> arup_players;
- QVector<QString> arup_statuses;
- QVector<QString> arup_cms;
- QVector<QString> arup_locks;
-
- QVector<chatlogpiece> ic_chatlog_history;
-
- // These map music row items and area row items to their actual IDs.
- QVector<int> music_row_to_number;
- QVector<int> area_row_to_number;
-
- // triggers ping_server() every 60 seconds
- QTimer *keepalive_timer;
-
- // determines how fast messages tick onto screen
- QTimer *chat_tick_timer;
- // int chat_tick_interval = 60;
- // which tick position(character in chat message) we are at
- int tick_pos = 0;
- // used to determine how often blips sound
- int blip_pos = 0;
- int blip_rate = 1;
- int rainbow_counter = 0;
- bool rainbow_appended = false;
- bool blank_blip = false;
-
- // The cursor to write with in mirror mode
- QTextCursor *mirror_cursor;
- // Used for getting the current maximum blocks allowed in the IC chatlog.
- int log_maximum_blocks = 0;
-
- // True, if the log should go downwards.
- bool log_goes_downwards = false;
-
- // delay before chat messages starts ticking
- QTimer *text_delay_timer;
-
- // delay before sfx plays
- QTimer *sfx_delay_timer;
-
- // keeps track of how long realization is visible(it's just a white square and
- // should be visible less than a second)
- QTimer *realization_timer;
-
- // every time point in char.inis times this equals the final time
- const int time_mod = 40;
-
- // the amount of time non-animated objection/hold it/takethat images stay
- // onscreen for in ms
- const int shout_stay_time = 724;
-
- // the amount of time non-animated guilty/not guilty images stay onscreen for
- // in ms
- const int verdict_stay_time = 3000;
-
- // the amount of time non-animated witness testimony/cross-examination images
- // stay onscreen for in ms
- const int wtce_stay_time = 1500;
-
- static const int chatmessage_size = 28;
- QString m_chatmessage[chatmessage_size];
- bool chatmessage_is_empty = false;
-
- QString previous_ic_message = "";
-
- // char id, muted or not
- QMap<int, bool> mute_map;
-
- // QVector<int> muted_cids;
-
- bool is_muted = false;
-
- // state of animation, 0 = objecting, 1 = preanim, 2 = talking, 3 = idle, 4 =
- // noniterrupting preanim
- int anim_state = 3;
-
- // state of text ticking, 0 = not yet ticking, 1 = ticking in progress, 2 =
- // ticking done
- int text_state = 2;
-
- // characters we consider punctuation
- const QString punctuation_chars = ".,?!:;";
-
- // amount by which we multiply the delay when we parse punctuation chars
- int punctuation_modifier = 0;
- bool slower_blips = false;
- // character id, which index of the char_list the player is
- int m_cid = -1;
- // cid and this may differ in cases of ini-editing
-
- QString char_name = "";
-
- int objection_state = 0;
- bool keep_custom_objection = false;
- QString objection_custom = "";
- int realization_state = 0;
- int screenshake_state = 0;
- int text_color = 0;
- bool is_presenting_evidence = false;
-
- int defense_bar_state = 0;
- int prosecution_bar_state = 0;
-
- int current_char_page = 0;
- int char_columns = 10;
- int char_rows = 9;
- int max_chars_on_page = 90;
-
- const int button_width = 60;
- const int button_height = 60;
-
- int current_emote_page = 0;
- int emote_columns = 5;
- int emote_rows = 2;
- int max_emotes_on_page = 10;
-
- QVector<evi_type> local_evidence_list;
-
- int current_evidence_page = 0;
- int current_evidence = 0;
- int evidence_columns = 6;
- int evidence_rows = 3;
- int max_evidence_on_page = 18;
-
- // is set to true if the bg folder contains defensedesk.png,
- // prosecutiondesk.png and stand.png
- bool is_ao2_bg = false;
-
- // whether or not to use text for buttons instead of images, true is text
- bool change_char_fallback = true;
- bool reload_theme_fallback = true;
- bool settings_fallback = true;
- bool call_mod_fallback = true;
- bool casing_fallback = true;
- bool amswap_fallback = true;
- bool ooc_toggle_fallback = true;
-
- // whether the ooc chat is server or master chat, true is server
- bool server_ooc = true;
-
- // Is AFK enabled
- bool isafk = false;
- QString current_background = "default";
-
- AOMusicPlayer *music_player;
- AOSfxPlayer *sfx_player;
- AOSfxPlayer *misc_sfx_player;
- AOSfxPlayer *frame_emote_sfx_player;
- AOSfxPlayer *pair_frame_emote_sfx_player;
- AOSfxPlayer *objection_player;
- AOBlipPlayer *blip_player;
-
- AOSfxPlayer *modcall_player;
-
- AOImage *ui_background;
-
- QWidget *ui_viewport;
- AOScene *ui_vp_background;
- AOMovie *ui_vp_speedlines;
- AOCharMovie *ui_vp_player_char;
- AOCharMovie *ui_vp_sideplayer_char;
- AOScene *ui_vp_desk;
- AOScene *ui_vp_legacy_desk;
- AOEvidenceDisplay *ui_vp_evidence_display;
- AOImage *ui_vp_chatbox;
- QLabel *ui_vp_showname;
- QTextEdit *ui_vp_message;
- AOMovie *ui_vp_realization;
- AOMovie *ui_vp_testimony;
- AOMovie *ui_vp_wtce;
- AOMovie *ui_vp_objection;
- void realization_done();
-
- bool colorf_iclog = false;
- bool mirror_iclog = false;
- bool colorf_limit = false;
-
- bool keep_evidence_display = false;
-
- QTextEdit *ui_ic_chatlog;
-
- AOTextArea *ui_ms_chatlog;
- AOTextArea *ui_server_chatlog;
-
- QListWidget *ui_mute_list;
- QListWidget *ui_area_list;
- QTreeWidget *ui_music_list;
-
- AOButton *ui_pair_button;
- QListWidget *ui_pair_list;
- QSpinBox *ui_pair_offset_spinbox;
-
- QLineEdit *ui_ic_chat_message;
- QLineEdit *ui_ic_chat_name;
-
- QLineEdit *ui_ooc_chat_message;
- QLineEdit *ui_ooc_chat_name;
-
- // QLineEdit *ui_area_password;
- QLineEdit *ui_music_search;
- QString music_search_par = "";
- QString area_search_par = "";
-
- QWidget *ui_emotes;
- QVector<AOEmoteButton *> ui_emote_list;
- AOButton *ui_emote_left;
- AOButton *ui_emote_right;
-
- QComboBox *ui_emote_dropdown;
- QComboBox *ui_pos_dropdown;
-
- AOImage *ui_defense_bar;
- AOImage *ui_prosecution_bar;
-
- QLabel *ui_music_label;
- QLabel *ui_sfx_label;
- QLabel *ui_blip_label;
-
- AOButton *ui_hold_it;
- AOButton *ui_objection;
- AOButton *ui_take_that;
-
- AOButton *ui_ooc_toggle;
-
- AOButton *ui_witness_testimony;
- AOButton *ui_cross_examination;
- AOButton *ui_guilty;
- AOButton *ui_not_guilty;
-
- AOButton *ui_change_character;
- AOButton *ui_reload_theme;
- AOButton *ui_call_mod;
- AOButton *ui_settings;
- AOButton *ui_announce_casing;
- AOButton *ui_switch_area_music;
-
- QCheckBox *ui_pre;
- QCheckBox *ui_flip;
- QCheckBox *ui_guard;
- QCheckBox *ui_casing;
-
- QCheckBox *ui_pre_non_interrupt;
- QCheckBox *ui_showname_enable;
-
- AOButton *ui_custom_objection;
- AOButton *ui_realization;
- AOButton *ui_screenshake;
- AOButton *ui_mute;
-
- QMenu *custom_obj_menu;
-
- AOButton *ui_defense_plus;
- AOButton *ui_defense_minus;
-
- AOButton *ui_prosecution_plus;
- AOButton *ui_prosecution_minus;
-
- QComboBox *ui_text_color;
-
- QSlider *ui_music_slider;
- QSlider *ui_sfx_slider;
- QSlider *ui_blip_slider;
-
- AOImage *ui_muted;
-
- QSpinBox *ui_log_limit_spinbox;
- QLabel *ui_log_limit_label;
-
- AOButton *ui_evidence_button;
- AOImage *ui_evidence;
- AOLineEdit *ui_evidence_name;
- QWidget *ui_evidence_buttons;
- QVector<AOEvidenceButton *> ui_evidence_list;
- AOButton *ui_evidence_left;
- AOButton *ui_evidence_right;
- AOButton *ui_evidence_present;
- AOImage *ui_evidence_overlay;
- AOButton *ui_evidence_delete;
- AOLineEdit *ui_evidence_image_name;
- AOButton *ui_evidence_image_button;
- AOButton *ui_evidence_x;
- AOTextEdit *ui_evidence_description;
-
- AOImage *ui_char_select_background;
-
- AOImage *ui_selector;
-
- AOButton *ui_back_to_lobby;
-
- QLineEdit *ui_char_password;
-
- AOButton *ui_char_select_left;
- AOButton *ui_char_select_right;
-
- AOButton *ui_spectator;
-
- void construct_char_select();
- void set_char_select();
- void set_char_select_page();
- void put_button_in_place(int starting, int chars_on_this_page);
- void filter_character_list();
-
- void construct_emotes();
- void set_emote_page();
- void set_emote_dropdown();
-
- void construct_evidence();
- void set_evidence_page();
-
-public slots:
- void objection_done();
- void preanim_done();
-
- void mod_called(QString p_ip);
-
- void case_called(QString msg, bool def, bool pro, bool jud, bool jur,
- bool steno, bool witness);
-
-private slots:
- void start_chat_ticking();
- void play_sfx();
-
- void chat_tick();
-
- void on_mute_list_clicked(QModelIndex p_index);
- void on_pair_list_clicked(QModelIndex p_index);
-
- void on_chat_return_pressed();
-
- void on_ooc_return_pressed();
-
- void on_music_search_keypr();
- void on_music_search_edited(QString p_text);
- void on_music_list_double_clicked(QTreeWidgetItem *p_item, int column);
- void on_area_list_double_clicked(QModelIndex p_model);
-
- void select_emote(int p_id);
-
- void on_emote_clicked(int p_id);
-
- void on_emote_left_clicked();
- void on_emote_right_clicked();
-
- void on_emote_dropdown_changed(int p_index);
- void on_pos_dropdown_changed(int p_index);
-
- void on_evidence_name_edited();
- void on_evidence_image_name_edited();
- void on_evidence_image_button_clicked();
- void on_evidence_clicked(int p_id);
- void on_evidence_double_clicked(int p_id);
-
- void on_evidence_hover(int p_id, bool p_state);
-
- void on_evidence_left_clicked();
- void on_evidence_right_clicked();
- void on_evidence_present_clicked();
-
- void on_hold_it_clicked();
- void on_objection_clicked();
- void on_take_that_clicked();
- void on_custom_objection_clicked();
- void ShowContextMenu(const QPoint &pos);
-
- void on_realization_clicked();
- void on_screenshake_clicked();
-
- void on_mute_clicked();
- void on_pair_clicked();
-
- void on_defense_minus_clicked();
- void on_defense_plus_clicked();
- void on_prosecution_minus_clicked();
- void on_prosecution_plus_clicked();
-
- void on_text_color_changed(int p_color);
-
- void on_music_slider_moved(int p_value);
- void on_sfx_slider_moved(int p_value);
- void on_blip_slider_moved(int p_value);
-
- void on_log_limit_changed(int value);
- void on_pair_offset_changed(int value);
-
- void on_ooc_toggle_clicked();
-
- void on_witness_testimony_clicked();
- void on_cross_examination_clicked();
- void on_not_guilty_clicked();
- void on_guilty_clicked();
-
- void on_change_character_clicked();
- void on_reload_theme_clicked();
- void on_call_mod_clicked();
- void on_settings_clicked();
- void on_announce_casing_clicked();
-
- void on_pre_clicked();
- void on_flip_clicked();
- void on_guard_clicked();
-
- void on_showname_enable_clicked();
-
- void on_evidence_button_clicked();
-
- void on_evidence_delete_clicked();
- void on_evidence_x_clicked();
-
- void on_back_to_lobby_clicked();
-
- void on_char_select_left_clicked();
- void on_char_select_right_clicked();
- void on_char_search_changed();
- void on_char_taken_clicked();
- void on_char_passworded_clicked();
-
- void on_spectator_clicked();
-
- void char_clicked(int n_char);
-
- void on_switch_area_music_clicked();
-
- void on_casing_clicked();
-
- void ping_server();
-
-#ifdef BASSAUDIO
- void load_bass_opus_plugin();
-#endif
-};
-
-#endif // COURTROOM_H
+#ifndef COURTROOM_H
+#define COURTROOM_H
+
+#include "aoapplication.h"
+#include "aoblipplayer.h"
+#include "aobutton.h"
+#include "aocharbutton.h"
+#include "aocharmovie.h"
+#include "aoemotebutton.h"
+#include "aoevidencebutton.h"
+#include "aoevidencedisplay.h"
+#include "aoimage.h"
+#include "aolineedit.h"
+#include "aomovie.h"
+#include "aomusicplayer.h"
+#include "aooptionsdialog.h"
+#include "aopacket.h"
+#include "aoscene.h"
+#include "aosfxplayer.h"
+#include "aotextarea.h"
+#include "aotextedit.h"
+#include "chatlogpiece.h"
+#include "datatypes.h"
+#include "debug_functions.h"
+#include "file_functions.h"
+#include "hardware_functions.h"
+#include "lobby.h"
+#include "scrolltext.h"
+
+#include <QCheckBox>
+#include <QCloseEvent>
+#include <QComboBox>
+#include <QHeaderView>
+#include <QLineEdit>
+#include <QListWidget>
+#include <QMainWindow>
+#include <QMap>
+#include <QPlainTextEdit>
+#include <QSlider>
+#include <QSpinBox>
+#include <QTextBrowser>
+#include <QTreeWidget>
+#include <QVector>
+
+#include <QBrush>
+#include <QDebug>
+#include <QDesktopServices>
+#include <QFileDialog>
+#include <QFont>
+#include <QInputDialog>
+#include <QMenu>
+#include <QMessageBox>
+#include <QParallelAnimationGroup>
+#include <QPropertyAnimation>
+#include <QRegExp>
+#include <QScrollBar>
+#include <QTextBoundaryFinder>
+#include <QTextCharFormat>
+//#include <QRandomGenerator>
+
+#include <stack>
+
+class AOApplication;
+
+class Courtroom : public QMainWindow {
+ Q_OBJECT
+public:
+ explicit Courtroom(AOApplication *p_ao_app);
+
+ void append_char(char_type p_char) { char_list.append(p_char); }
+ void append_evidence(evi_type p_evi) { evidence_list.append(p_evi); }
+ void append_music(QString f_music) { music_list.append(f_music); }
+ void append_area(QString f_area) { area_list.append(f_area); }
+ void clear_music() { music_list.clear(); }
+ void clear_areas() { area_list.clear(); }
+
+ void fix_last_area()
+ {
+ if (area_list.size() > 0) {
+ QString malplaced = area_list.last();
+ area_list.removeLast();
+ append_music(malplaced);
+ }
+ }
+
+ void arup_append(int players, QString status, QString cm, QString locked)
+ {
+ arup_players.append(players);
+ arup_statuses.append(status);
+ arup_cms.append(cm);
+ arup_locks.append(locked);
+ }
+
+ void arup_modify(int type, int place, QString value)
+ {
+ if (type == 0) {
+ if (arup_players.size() > place)
+ arup_players[place] = value.toInt();
+ }
+ else if (type == 1) {
+ if (arup_statuses.size() > place)
+ arup_statuses[place] = value;
+ }
+ else if (type == 2) {
+ if (arup_cms.size() > place)
+ arup_cms[place] = value;
+ }
+ else if (type == 3) {
+ if (arup_locks.size() > place)
+ arup_locks[place] = value;
+ }
+ list_areas();
+ }
+
+ void character_loading_finished();
+
+ // sets position of widgets based on theme ini files
+ void set_widgets();
+
+ // sets font size based on theme ini files
+ void set_font(QWidget *widget, QString class_name, QString p_identifier, QString p_char="", QString font_name="", int f_pointsize=0);
+
+ // Get the properly constructed font
+ QFont get_qfont(QString font_name, int f_pointsize, bool antialias = true);
+
+ // actual operation of setting the font on a widget
+ void set_qfont(QWidget *widget, QString class_name, QFont font,
+ QColor f_color = Qt::black, bool bold = false);
+
+ // helper function that calls above function on the relevant widgets
+ void set_fonts(QString p_char="");
+
+ // sets dropdown menu stylesheet
+ void set_dropdown(QWidget *widget);
+
+ // helper funciton that call above function on the relevant widgets
+ void set_dropdowns();
+
+ void set_window_title(QString p_title);
+
+ // reads theme inis and sets size and pos based on the identifier
+ void set_size_and_pos(QWidget *p_widget, QString p_identifier);
+
+ // reads theme inis and returns the size and pos as defined by it
+ QPoint get_theme_pos(QString p_identifier);
+
+ // sets status as taken on character with cid n_char and places proper shading
+ // on charselect
+ void set_taken(int n_char, bool p_taken);
+
+ // sets the current background to argument. also does some checks to see if
+ // it's a legacy bg
+ void set_background(QString p_background, bool display = false);
+
+ // sets the local character pos/side to use.
+ void set_side(QString p_side);
+
+ // sets the pos dropdown
+ void set_pos_dropdown(QStringList pos_dropdowns);
+
+ // sets the evidence list member variable to argument
+ void set_evidence_list(QVector<evi_type> &p_evi_list);
+
+ // called when a DONE#% from the server was received
+ void done_received();
+
+ // sets the local mute list based on characters available on the server
+ void set_mute_list();
+
+ // Sets the local pair list based on the characters available on the server.
+ void set_pair_list();
+
+ // sets desk and bg based on pos in chatmessage
+ void set_scene(QString f_desk_mod, QString f_side);
+
+ // takes in serverD-formatted IP list as prints a converted version to server
+ // OOC admittedly poorly named
+ void set_ip_list(QString p_list);
+
+ // disables chat if current cid matches second argument
+ // enables if p_muted is false
+ void set_mute(bool p_muted, int p_cid);
+
+ // send a message that the player is banned and quits the server
+ void set_ban(int p_cid);
+
+ // cid = character id, returns the cid of the currently selected character
+ int get_cid() { return m_cid; }
+ QString get_current_char() { return current_char; }
+ QString get_current_background() { return current_background; }
+
+ // updates character to p_cid and updates necessary ui elements
+ void update_character(int p_cid);
+
+ // properly sets up some varibles: resets user state
+ void enter_courtroom();
+
+ // helper function that populates ui_music_list with the contents of
+ // music_list
+ void list_music();
+ void list_areas();
+
+ // these are for OOC chat
+ void append_ms_chatmessage(QString f_name, QString f_message);
+ void append_server_chatmessage(QString p_name, QString p_message,
+ QString p_color);
+
+ // these functions handle chatmessages sequentially.
+ // The process itself is very convoluted and merits separate documentation
+ // But the general idea is objection animation->pre animation->talking->idle
+ void handle_chatmessage(QStringList *p_contents);
+ void handle_chatmessage_2();
+ void handle_chatmessage_3();
+
+ // This function filters out the common CC inline text trickery, for appending
+ // to the IC chatlog.
+ QString filter_ic_text(QString p_text, bool colorize = false, int pos = -1,
+ int default_color = 0);
+
+ // adds text to the IC chatlog. p_name first as bold then p_text then a newlin
+ // this function keeps the chatlog scrolled to the top unless there's text
+ // selected
+ // or the user isn't already scrolled to the top
+ void append_ic_text(QString p_text, QString p_name = "", QString action = "", int color = 0);
+
+ // prints who played the song to IC chat and plays said song(if found on local
+ // filesystem) takes in a list where the first element is the song name and
+ // the second is the char id of who played it
+ void handle_song(QStringList *p_contents);
+
+ void play_preanim(bool noninterrupting);
+
+ // plays the witness testimony or cross examination animation based on
+ // argument
+ void handle_wtce(QString p_wtce, int variant);
+
+ // sets the hp bar of defense(p_bar 1) or pro(p_bar 2)
+ // state is an number between 0 and 10 inclusive
+ void set_hp_bar(int p_bar, int p_state);
+
+ // Toggles the judge buttons, whether they should appear or not.
+ void toggle_judge_buttons(bool is_on);
+
+ void announce_case(QString title, bool def, bool pro, bool jud, bool jur,
+ bool steno);
+
+ void check_connection_received();
+
+ ~Courtroom();
+
+private:
+ AOApplication *ao_app;
+
+ int m_courtroom_width = 714;
+ int m_courtroom_height = 668;
+
+ int m_viewport_x = 0;
+ int m_viewport_y = 0;
+
+ int m_viewport_width = 256;
+ int m_viewport_height = 192;
+
+ bool first_message_sent = false;
+ int maximumMessages = 0;
+
+ QParallelAnimationGroup *screenshake_animation_group =
+ new QParallelAnimationGroup;
+
+ bool next_character_is_not_special = false; // If true, write the
+ // next character as it is.
+
+ bool message_is_centered = false;
+
+ int current_display_speed = 3;
+ int message_display_speed[7] = {0, 10, 25, 40, 50, 70, 90};
+
+ // The character ID of the character this user wants to appear alongside with.
+ int other_charid = -1;
+
+ // The offset this user has given if they want to appear alongside someone.
+ int char_offset = 0;
+
+ // 0 = in front, 1 = behind
+ int pair_order = 0;
+
+ QVector<char_type> char_list;
+ QVector<evi_type> evidence_list;
+ QVector<QString> music_list;
+ QVector<QString> area_list;
+
+ QVector<int> arup_players;
+ QVector<QString> arup_statuses;
+ QVector<QString> arup_cms;
+ QVector<QString> arup_locks;
+
+ QVector<chatlogpiece> ic_chatlog_history;
+
+ // triggers ping_server() every 60 seconds
+ QTimer *keepalive_timer;
+
+ // determines how fast messages tick onto screen
+ QTimer *chat_tick_timer;
+ // int chat_tick_interval = 60;
+ // which tick position(character in chat message) we are at
+ int tick_pos = 0;
+ // the actual document tick pos we gotta worry about for making the text
+ // scroll better
+ int real_tick_pos = 0;
+ // used to determine how often blips sound
+ int blip_ticker = 0;
+ int blip_rate = 1;
+ int rainbow_counter = 0;
+ bool rainbow_appended = false;
+ bool blank_blip = false;
+
+ // Whether or not is this message additive to the previous one
+ bool is_additive = false;
+
+ // Used for getting the current maximum blocks allowed in the IC chatlog.
+ int log_maximum_blocks = 0;
+
+ // True, if the log should go downwards.
+ bool log_goes_downwards = false;
+
+ // delay before chat messages starts ticking
+ QTimer *text_delay_timer;
+
+ // delay before sfx plays
+ QTimer *sfx_delay_timer;
+
+ // every time point in char.inis times this equals the final time
+ const int time_mod = 40;
+
+ // the amount of time non-animated objection/hold it/takethat images stay
+ // onscreen for in ms
+ const int shout_stay_time = 724;
+
+ // the amount of time non-animated guilty/not guilty images stay onscreen for
+ // in ms
+ const int verdict_stay_time = 3000;
+
+ // the amount of time non-animated witness testimony/cross-examination images
+ // stay onscreen for in ms
+ const int wtce_stay_time = 1500;
+
+ // characters we consider punctuation
+ const QString punctuation_chars = ".,?!:;";
+
+ // amount by which we multiply the delay when we parse punctuation chars
+ const int punctuation_modifier = 3;
+
+ static const int chatmessage_size = 30;
+ QString m_chatmessage[chatmessage_size];
+ bool chatmessage_is_empty = false;
+
+ QString previous_ic_message = "";
+ QString additive_previous = "";
+
+ // char id, muted or not
+ QMap<int, bool> mute_map;
+
+ // QVector<int> muted_cids;
+
+ bool is_muted = false;
+
+ // state of animation, 0 = objecting, 1 = preanim, 2 = talking, 3 = idle, 4 =
+ // noniterrupting preanim
+ int anim_state = 3;
+
+ // whether or not current color is a talking one
+ bool color_is_talking = true;
+
+ // state of text ticking, 0 = not yet ticking, 1 = ticking in progress, 2 =
+ // ticking done
+ int text_state = 2;
+
+ // character id, which index of the char_list the player is
+ int m_cid = -1;
+ // cid and this may differ in cases of ini-editing
+ QString current_char = "";
+
+ int objection_state = 0;
+ QString objection_custom = "";
+ int realization_state = 0;
+ int screenshake_state = 0;
+ int text_color = 0;
+
+ // How many unique user colors are possible
+ static const int max_colors = 12;
+
+ // Text Color-related optimization:
+ // Current color list indexes to real color references
+ QVector<int> color_row_to_number;
+
+ // List of associated RGB colors for this color index
+ QVector<QColor> color_rgb_list;
+
+ // List of markdown start characters, their index is tied to the color index
+ QStringList color_markdown_start_list;
+
+ // List of markdown end characters, their index is tied to the color index
+ QStringList color_markdown_end_list;
+
+ // Whether or not we're supposed to remove this char during parsing
+ QVector<bool> color_markdown_remove_list;
+
+ // Whether or not this color allows us to play the talking animation
+ QVector<bool> color_markdown_talking_list;
+ // Text Color-related optimization END
+
+ // List of all currently available pos
+ QStringList pos_dropdown_list;
+
+ bool is_presenting_evidence = false;
+
+ QString effect = "";
+
+ // Music effect flags we want to send to server when we play music
+ int music_flags = FADE_OUT;
+
+ int defense_bar_state = 0;
+ int prosecution_bar_state = 0;
+
+ int current_char_page = 0;
+ int char_columns = 10;
+ int char_rows = 9;
+ int max_chars_on_page = 90;
+
+ const int button_width = 60;
+ const int button_height = 60;
+
+ int current_emote_page = 0;
+ int current_emote = 0;
+ int emote_columns = 5;
+ int emote_rows = 2;
+ int max_emotes_on_page = 10;
+
+ QVector<evi_type> local_evidence_list;
+ QVector<evi_type> private_evidence_list;
+ QVector<evi_type> global_evidence_list;
+
+ // false = use private_evidence_list
+ bool current_evidence_global = true;
+
+ int current_evidence_page = 0;
+ int current_evidence = 0;
+ int evidence_columns = 6;
+ int evidence_rows = 3;
+ int max_evidence_on_page = 18;
+
+ // is set to true if the bg folder contains defensedesk.png,
+ // prosecutiondesk.png and stand.png
+ bool is_ao2_bg = false;
+
+ // whether the ooc chat is server or master chat, true is server
+ bool server_ooc = true;
+
+ QString current_background = "default";
+ QString current_side = "";
+
+ AOMusicPlayer *music_player;
+ AOSfxPlayer *sfx_player;
+ AOSfxPlayer *objection_player;
+ AOBlipPlayer *blip_player;
+
+ AOSfxPlayer *modcall_player;
+
+ AOImage *ui_background;
+
+ QWidget *ui_viewport;
+ AOScene *ui_vp_background;
+ AOMovie *ui_vp_speedlines;
+ AOCharMovie *ui_vp_player_char;
+ AOCharMovie *ui_vp_sideplayer_char;
+ AOScene *ui_vp_desk;
+ AOScene *ui_vp_legacy_desk;
+ AOEvidenceDisplay *ui_vp_evidence_display;
+ AOImage *ui_vp_chatbox;
+ QLabel *ui_vp_showname;
+ AOMovie *ui_vp_chat_arrow;
+ QTextEdit *ui_vp_message;
+ AOMovie *ui_vp_effect;
+ AOMovie *ui_vp_testimony;
+ AOMovie *ui_vp_wtce;
+ AOMovie *ui_vp_objection;
+
+ QTextEdit *ui_ic_chatlog;
+
+ AOTextArea *ui_ms_chatlog;
+ AOTextArea *ui_server_chatlog;
+
+ QListWidget *ui_mute_list;
+ QTreeWidget *ui_area_list;
+ QTreeWidget *ui_music_list;
+
+ ScrollText *ui_music_name;
+ AOMovie *ui_music_display;
+
+ AOButton *ui_pair_button;
+ QListWidget *ui_pair_list;
+ QSpinBox *ui_pair_offset_spinbox;
+
+ QComboBox *ui_pair_order_dropdown;
+
+ AOLineEdit *ui_ic_chat_message;
+ QLineEdit *ui_ic_chat_name;
+
+ QLineEdit *ui_ooc_chat_message;
+ QLineEdit *ui_ooc_chat_name;
+
+ // QLineEdit *ui_area_password;
+ QLineEdit *ui_music_search;
+
+ QWidget *ui_emotes;
+ QVector<AOEmoteButton *> ui_emote_list;
+ AOButton *ui_emote_left;
+ AOButton *ui_emote_right;
+
+ QComboBox *ui_emote_dropdown;
+ QComboBox *ui_pos_dropdown;
+
+ QComboBox *ui_iniswap_dropdown;
+ AOButton *ui_iniswap_remove;
+
+ QComboBox *ui_sfx_dropdown;
+ AOButton *ui_sfx_remove;
+
+ QComboBox *ui_effects_dropdown;
+
+ AOImage *ui_defense_bar;
+ AOImage *ui_prosecution_bar;
+
+ QLabel *ui_music_label;
+ QLabel *ui_sfx_label;
+ QLabel *ui_blip_label;
+
+ AOButton *ui_hold_it;
+ AOButton *ui_objection;
+ AOButton *ui_take_that;
+
+ AOButton *ui_ooc_toggle;
+
+ AOButton *ui_witness_testimony;
+ AOButton *ui_cross_examination;
+ AOButton *ui_guilty;
+ AOButton *ui_not_guilty;
+
+ AOButton *ui_change_character;
+ AOButton *ui_reload_theme;
+ AOButton *ui_call_mod;
+ AOButton *ui_settings;
+ AOButton *ui_announce_casing;
+ AOButton *ui_switch_area_music;
+
+ QCheckBox *ui_pre;
+ QCheckBox *ui_flip;
+ QCheckBox *ui_additive;
+ QCheckBox *ui_guard;
+ QCheckBox *ui_casing;
+
+ QCheckBox *ui_pre_non_interrupt;
+ QCheckBox *ui_showname_enable;
+
+ AOButton *ui_custom_objection;
+ QMenu *custom_obj_menu;
+ AOButton *ui_realization;
+ AOButton *ui_screenshake;
+ AOButton *ui_mute;
+
+ AOButton *ui_defense_plus;
+ AOButton *ui_defense_minus;
+
+ AOButton *ui_prosecution_plus;
+ AOButton *ui_prosecution_minus;
+
+ QComboBox *ui_text_color;
+
+ QSlider *ui_music_slider;
+ QSlider *ui_sfx_slider;
+ QSlider *ui_blip_slider;
+
+ AOImage *ui_muted;
+
+ AOButton *ui_evidence_button;
+ AOImage *ui_evidence;
+ AOLineEdit *ui_evidence_name;
+ QWidget *ui_evidence_buttons;
+ QVector<AOEvidenceButton *> ui_evidence_list;
+ AOButton *ui_evidence_left;
+ AOButton *ui_evidence_right;
+ AOButton *ui_evidence_present;
+ AOImage *ui_evidence_overlay;
+ AOButton *ui_evidence_delete;
+ AOLineEdit *ui_evidence_image_name;
+ AOButton *ui_evidence_image_button;
+ AOButton *ui_evidence_x;
+ AOButton *ui_evidence_ok;
+ AOButton *ui_evidence_switch;
+ AOButton *ui_evidence_transfer;
+ AOButton *ui_evidence_save;
+ AOButton *ui_evidence_load;
+ AOTextEdit *ui_evidence_description;
+
+ AOImage *ui_char_select_background;
+
+ // abstract widget to hold char buttons
+ QWidget *ui_char_buttons;
+
+ QVector<AOCharButton *> ui_char_button_list;
+ QVector<AOCharButton *> ui_char_button_list_filtered;
+ AOImage *ui_selector;
+
+ AOButton *ui_back_to_lobby;
+
+ QLineEdit *ui_char_password;
+
+ AOButton *ui_char_select_left;
+ AOButton *ui_char_select_right;
+
+ AOButton *ui_spectator;
+
+ QLineEdit *ui_char_search;
+ QCheckBox *ui_char_passworded;
+ QCheckBox *ui_char_taken;
+
+ void construct_char_select();
+ void set_char_select();
+ void set_char_select_page();
+ void char_clicked(int n_char);
+ void put_button_in_place(int starting, int chars_on_this_page);
+ void filter_character_list();
+
+ void initialize_emotes();
+ void refresh_emotes();
+ void set_emote_page();
+ void set_emote_dropdown();
+
+ void initialize_evidence();
+ void refresh_evidence();
+ void set_evidence_page();
+
+public slots:
+ void objection_done();
+ void preanim_done();
+ void do_screenshake();
+ void do_flash();
+ void do_effect(QString fx_path, QString fx_sound, QString p_char,
+ QString p_folder);
+ void play_char_sfx(QString sfx_name);
+
+ void mod_called(QString p_ip);
+
+ void case_called(QString msg, bool def, bool pro, bool jud, bool jur,
+ bool steno);
+
+private slots:
+ void start_chat_ticking();
+ void play_sfx();
+
+ void chat_tick();
+
+ void on_mute_list_clicked(QModelIndex p_index);
+ void on_pair_list_clicked(QModelIndex p_index);
+
+ void on_chat_return_pressed();
+
+ void on_ooc_return_pressed();
+
+ void on_music_search_return_pressed();
+ void on_music_search_edited(QString p_text);
+ void on_music_list_double_clicked(QTreeWidgetItem *p_item, int column);
+ void on_music_list_context_menu_requested(const QPoint &pos);
+ void music_fade_out(bool toggle);
+ void music_fade_in(bool toggle);
+ void music_synchronize(bool toggle);
+ void music_random();
+ void music_list_expand_all();
+ void music_list_collapse_all();
+ void on_area_list_double_clicked(QTreeWidgetItem *p_item, int column);
+
+ void select_emote(int p_id);
+
+ void on_emote_clicked(int p_id);
+
+ void on_emote_left_clicked();
+ void on_emote_right_clicked();
+
+ void on_emote_dropdown_changed(int p_index);
+ void on_pos_dropdown_changed(int p_index);
+
+ void on_iniswap_dropdown_changed(int p_index);
+ void set_iniswap_dropdown();
+ void on_iniswap_context_menu_requested(const QPoint &pos);
+ void on_iniswap_edit_requested();
+ void on_iniswap_remove_clicked();
+
+ void on_sfx_dropdown_changed(int p_index);
+ void set_sfx_dropdown();
+ void on_sfx_context_menu_requested(const QPoint &pos);
+ void on_sfx_edit_requested();
+ void on_sfx_remove_clicked();
+
+ void set_effects_dropdown();
+ void on_effects_context_menu_requested(const QPoint &pos);
+ void on_effects_edit_requested();
+ void on_character_effects_edit_requested();
+ void on_effects_dropdown_changed(int p_index);
+ bool effects_dropdown_find_and_set(QString effect);
+
+ QString get_char_sfx();
+ int get_char_sfx_delay();
+
+ void on_evidence_name_edited();
+ void on_evidence_image_name_edited();
+ void on_evidence_image_button_clicked();
+ void on_evidence_clicked(int p_id);
+ void on_evidence_double_clicked(int p_id);
+
+ void on_evidence_hover(int p_id, bool p_state);
+
+ void on_evidence_left_clicked();
+ void on_evidence_right_clicked();
+ void on_evidence_present_clicked();
+
+ void on_hold_it_clicked();
+ void on_objection_clicked();
+ void on_take_that_clicked();
+ void on_custom_objection_clicked();
+ void show_custom_objection_menu(const QPoint &pos);
+
+ void on_realization_clicked();
+ void on_screenshake_clicked();
+
+ void on_mute_clicked();
+ void on_pair_clicked();
+ void on_pair_order_dropdown_changed(int p_index);
+
+ void on_defense_minus_clicked();
+ void on_defense_plus_clicked();
+ void on_prosecution_minus_clicked();
+ void on_prosecution_plus_clicked();
+
+ void on_text_color_changed(int p_color);
+ void set_text_color_dropdown();
+
+ void on_music_slider_moved(int p_value);
+ void on_sfx_slider_moved(int p_value);
+ void on_blip_slider_moved(int p_value);
+
+ void on_log_limit_changed(int value);
+ void on_pair_offset_changed(int value);
+
+ void on_ooc_toggle_clicked();
+
+ void on_witness_testimony_clicked();
+ void on_cross_examination_clicked();
+ void on_not_guilty_clicked();
+ void on_guilty_clicked();
+
+ void on_change_character_clicked();
+ void on_reload_theme_clicked();
+ void on_call_mod_clicked();
+ void on_settings_clicked();
+ void on_announce_casing_clicked();
+
+ void on_pre_clicked();
+ void on_flip_clicked();
+ void on_additive_clicked();
+ void on_guard_clicked();
+
+ void on_showname_enable_clicked();
+
+ void on_evidence_name_double_clicked();
+ void on_evidence_image_name_double_clicked();
+ void on_evidence_button_clicked();
+
+ void on_evidence_delete_clicked();
+ void on_evidence_x_clicked();
+ void on_evidence_ok_clicked();
+ void on_evidence_switch_clicked();
+ void on_evidence_transfer_clicked();
+
+ void on_evidence_edited();
+
+ void evidence_close();
+ void evidence_switch(bool global);
+ void on_evidence_save_clicked();
+ void on_evidence_load_clicked();
+ bool compare_evidence_changed(evi_type evi_a, evi_type evi_b);
+
+ void on_back_to_lobby_clicked();
+
+ void on_char_select_left_clicked();
+ void on_char_select_right_clicked();
+ void on_char_search_changed();
+ void on_char_taken_clicked();
+ void on_char_passworded_clicked();
+
+ void on_spectator_clicked();
+
+ void on_switch_area_music_clicked();
+
+ void on_casing_clicked();
+
+ void ping_server();
+
+ void load_bass_opus_plugin();
+};
+
+#endif // COURTROOM_H
diff --git a/include/datatypes.h b/include/datatypes.h
index 89d4a40c..21ade040 100644
--- a/include/datatypes.h
+++ b/include/datatypes.h
@@ -96,9 +96,11 @@ enum CHAT_MESSAGE {
SCREENSHAKE,
FRAME_SCREENSHAKE,
FRAME_REALIZATION,
- FRAME_SFX
+ FRAME_SFX,
+ ADDITIVE,
+ EFFECTS
};
-enum COLOR { WHITE = 0, GREEN, RED, ORANGE, BLUE, YELLOW, RAINBOW, PINK, CYAN };
+enum MUSIC_EFFECT { FADE_IN = 1, FADE_OUT = 2, SYNC_POS = 4 };
#endif // DATATYPES_H
diff --git a/include/discord_rich_presence.h b/include/discord_rich_presence.h
index 71c85e25..42de59e2 100644
--- a/include/discord_rich_presence.h
+++ b/include/discord_rich_presence.h
@@ -8,6 +8,7 @@
#include <string>
#include <discord-rpc.h>
+#include <string>
#include <cstring>
#include <ctime>
diff --git a/include/lobby.h b/include/lobby.h
index a9b60571..42f52977 100644
--- a/include/lobby.h
+++ b/include/lobby.h
@@ -13,6 +13,7 @@
#include <QPlainTextEdit>
#include <QProgressBar>
#include <QTextBrowser>
+#include <QTreeWidget>
#include <QDebug>
#include <QScrollBar>
@@ -31,13 +32,17 @@ public:
void append_chatmessage(QString f_name, QString f_message);
void append_error(QString f_message);
void set_player_count(int players_online, int max_players);
+ void set_stylesheet(QWidget *widget, QString target_tag);
+ void set_stylesheets();
+ void set_fonts();
+ void set_font(QWidget *widget, QString p_identifier);
void set_loading_text(QString p_text);
void show_loading_overlay() { ui_loading_background->show(); }
void hide_loading_overlay() { ui_loading_background->hide(); }
QString get_chatlog();
int get_selected_server();
void enable_connect_button();
- void check_update();
+
void set_loading_value(int p_value);
bool public_servers_selected = true;
@@ -59,7 +64,10 @@ private:
QLabel *ui_version;
AOButton *ui_about;
- QListWidget *ui_server_list;
+ AOButton *ui_settings;
+
+ QTreeWidget *ui_server_list;
+ QLineEdit *ui_server_search;
QLabel *ui_player_count;
AOTextArea *ui_description;
@@ -74,11 +82,10 @@ private:
QProgressBar *ui_progress_bar;
AOButton *ui_cancel;
- QModelIndex last_model;
+ int last_index;
void set_size_and_pos(QWidget *p_widget, QString p_identifier);
-public slots:
- void lobbyThreadHandler(QString loadingText);
+
private slots:
void on_public_servers_clicked();
void on_favorites_clicked();
@@ -90,8 +97,10 @@ private slots:
void on_connect_pressed();
void on_connect_released();
void on_about_clicked();
- void on_server_list_clicked(QModelIndex p_model);
- void on_server_list_doubleclicked(QModelIndex p_model);
+ void on_settings_clicked();
+ void on_server_list_clicked(QTreeWidgetItem *p_item, int column);
+ void on_server_list_doubleclicked(QTreeWidgetItem *p_item, int column);
+ void on_server_search_edited(QString p_text);
void on_chatfield_return_pressed();
};
diff --git a/include/scrolltext.h b/include/scrolltext.h
new file mode 100644
index 00000000..9ed5ff77
--- /dev/null
+++ b/include/scrolltext.h
@@ -0,0 +1,47 @@
+#ifndef SCROLLTEXT_H
+#define SCROLLTEXT_H
+
+#include <QDebug>
+#include <QPainter>
+#include <QStaticText>
+#include <QTimer>
+#include <QWidget>
+
+class ScrollText : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(QString text READ text WRITE setText)
+ Q_PROPERTY(QString separator READ separator WRITE setSeparator)
+
+public:
+ explicit ScrollText(QWidget *parent = nullptr);
+
+public slots:
+ QString text() const;
+ void setText(QString text);
+
+ QString separator() const;
+ void setSeparator(QString separator);
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+ virtual void resizeEvent(QResizeEvent *);
+
+private:
+ void updateText();
+ QString _text;
+ QString _separator;
+ QStaticText staticText;
+ int singleTextWidth;
+ QSize wholeTextSize;
+ int leftMargin;
+ bool scrollEnabled;
+ int scrollPos;
+ QImage alphaChannel;
+ QImage buffer;
+ QTimer timer;
+
+private slots:
+ virtual void timer_timeout();
+};
+
+#endif // SCROLLTEXT_H