MusicSpectrum  1.0.0
Referência da Classe HUD

#include <hud.hpp>

Membros Públicos

void run ()
 
void handleEvents (sf::Event &event)
 
 HUD (std::shared_ptr< sf::RenderWindow > win)
 
 ~HUD ()
 

Atributos Públicos

int option = 3
 
sf::Sound sound
 
sf::SoundBuffer sound_buffer
 
std::vector< sf::Int16 > sample_buffer
 

Membros Privados

void initFont ()
 
void audioList ()
 
void modeAudio ()
 
void initTexture ()
 
void styleWidget ()
 
void drawAudioHUD ()
 
void controlAudio ()
 
void openFileDialog ()
 
void showAudioListWindow ()
 
void skipForward ()
 
void skipBackward ()
 
void playNextAudio ()
 
void resetControls ()
 
void toggleMusicMute ()
 
void playPreviousAudio ()
 
void toggleMusicPlayback ()
 
void setSoundBuffer (const std::string &filename)
 

Atributos Privados

const float icon_size = 17.0f
 
int fftMode = 0
 
int spectrumMode = 0
 
float volume = 10.f
 
bool isMuted = false
 
bool isPlaying = false
 
bool audioListWindow = false
 
std::size_t selectedIndex = 0
 
std::vector< std::string > list_audio
 
sf::Texture play_tex
 
sf::Texture pause_tex
 
sf::Texture stop_tex
 
sf::Texture forward_tex
 
sf::Texture backward_tex
 
sf::Texture previous_tex
 
sf::Texture next_tex
 
sf::Texture mute_tex
 
sf::Texture volume_tex
 
std::shared_ptr< sf::RenderWindow > window
 

Descrição detalhada

Classe que representa a interface gráfica do usuário (GUI) para interagir com arquivos de áudio.

A classe HUD (Heads-Up Display) gerencia a interface gráfica do usuário para interação com arquivos de áudio. Ela fornece controles para reproduzir, pausar, avançar, retroceder, ajustar volume, exibir e selecionar arquivos de áudio, entre outras funcionalidades.

Construtores e Destrutores

◆ HUD()

HUD::HUD ( std::shared_ptr< sf::RenderWindow >  win)

Construtor da classe HUD.

Inicializa a interface gráfica do usuário (GUI) utilizando a biblioteca ImGui. Carrega a fonte e as texturas necessárias.

win: Um ponteiro compartilhado para uma janela RenderWindow do SFML.

13  : window(win) {
14  if (!ImGui::SFML::Init(*window, false)) {
15  throw std::runtime_error("Error when Initializing RenderWindow!");
16  }
17  styleWidget();
18 
19  initFont();
20 
21  initTexture();
22 
23  sample_buffer.reserve(buffer_size);
24 }
void styleWidget()
Definition: ui.cpp:6
void initFont()
Definition: hud.cpp:30
std::vector< sf::Int16 > sample_buffer
Definition: hud.hpp:75
std::shared_ptr< sf::RenderWindow > window
Definition: hud.hpp:45
void initTexture()
Definition: hud.cpp:40
const size_t buffer_size
Definition: hud.hpp:13

◆ ~HUD()

HUD::~HUD ( )

Destrutor da classe HUD.

27 { ImGui::SFML::Shutdown(); }

Funções membros

◆ audioList()

void HUD::audioList ( )
private

Função para exibir a lista de áudio disponível

170  {
171  for (auto item = 0UL; item < list_audio.size(); ++item) {
172  const bool isSelected = (selectedIndex == item);
173 
174  std::size_t lastSlash = list_audio[item].find_last_of('/');
175  std::string filename = list_audio[item].substr(lastSlash + 1);
176 
177  if (ImGui::Selectable(filename.c_str(), isSelected)) {
178  selectedIndex = item;
180  }
181  }
182 }
std::size_t selectedIndex
Definition: hud.hpp:36
void setSoundBuffer(const std::string &filename)
Definition: hud.cpp:75
std::vector< std::string > list_audio
Definition: hud.hpp:37

◆ controlAudio()

void HUD::controlAudio ( )
private

Função para exibir controles de reprodução de áudio

81  {
82  ImGui::Text("Audio");
83  ImGui::Spacing();
84  if (ImGui::ImageButton(!isPlaying ? play_tex : pause_tex,
85  sf::Vector2f(icon_size, icon_size))) {
87  }
88  ImGui::SameLine();
89  if (ImGui::ImageButton(previous_tex, sf::Vector2f(icon_size, icon_size))) {
91  }
92  ImGui::SameLine();
93  if (ImGui::ImageButton(backward_tex, sf::Vector2f(icon_size, icon_size))) {
94  skipBackward();
95  }
96  ImGui::SameLine();
97  if (ImGui::ImageButton(stop_tex, sf::Vector2f(icon_size, icon_size))) {
98  sound.stop();
99  isPlaying = false;
100  }
101  ImGui::SameLine();
102  if (ImGui::ImageButton(forward_tex, sf::Vector2f(icon_size, icon_size))) {
103  skipForward();
104  }
105  ImGui::SameLine();
106  if (ImGui::ImageButton(next_tex, sf::Vector2f(icon_size, icon_size))) {
107  playNextAudio();
108  }
109  ImGui::Spacing();
110  ImGui::Spacing();
111  if (ImGui::ImageButton(isMuted ? mute_tex : volume_tex,
112  sf::Vector2f(icon_size + 3, icon_size + 3))) {
113  toggleMusicMute();
114  }
115  ImGui::SameLine();
116  if (ImGui::SliderFloat(" ", &volume, 0.f, 100.f, "%.0f")) {
117  volume += 0.f;
118  volume = std::max(0.f, std::min(100.f, volume));
119  sound.setVolume(volume);
120  }
121 }
sf::Texture play_tex
Definition: hud.hpp:39
void playNextAudio()
Definition: events.cpp:91
sf::Texture forward_tex
Definition: hud.hpp:40
sf::Texture next_tex
Definition: hud.hpp:42
const float icon_size
Definition: hud.hpp:26
void toggleMusicPlayback()
Definition: events.cpp:65
void skipBackward()
Definition: events.cpp:84
bool isPlaying
Definition: hud.hpp:33
void skipForward()
Definition: events.cpp:77
bool isMuted
Definition: hud.hpp:32
sf::Texture volume_tex
Definition: hud.hpp:43
void toggleMusicMute()
Definition: events.cpp:59
sf::Texture stop_tex
Definition: hud.hpp:40
sf::Texture backward_tex
Definition: hud.hpp:41
sf::Sound sound
Definition: hud.hpp:73
float volume
Definition: hud.hpp:30
sf::Texture mute_tex
Definition: hud.hpp:42
sf::Texture previous_tex
Definition: hud.hpp:41
void playPreviousAudio()
Definition: events.cpp:100
sf::Texture pause_tex
Definition: hud.hpp:39

◆ drawAudioHUD()

void HUD::drawAudioHUD ( )
private

◆ handleEvents()

void HUD::handleEvents ( sf::Event &  event)

Trata os eventos de entrada da janela SFML.

Esta função trata os eventos de teclado da janela SFML, respondendo a diferentes teclas para controlar a reprodução de áudio, ajustar o volume, pular faixas e fechar a janela.

event: Referência ao objeto sf::Event que contém informações sobre o evento.

13  {
14  switch (event.key.code) {
15  case sf::Keyboard::Space:
17  break;
18  case sf::Keyboard::M:
20  break;
21  case sf::Keyboard::Escape:
22  window->close();
23  break;
24  case sf::Keyboard::Left:
25  skipBackward();
26  break;
27  case sf::Keyboard::Right:
28  skipForward();
29  break;
30  case sf::Keyboard::Period:
31  playNextAudio();
32  break;
33  case sf::Keyboard::Comma:
35  break;
36  case sf::Keyboard::Enter: {
37  sound.stop();
38  isPlaying = false;
39  break;
40  }
41  case sf::Keyboard::Up: {
42  volume += 10.f;
43  volume > 100.f ? volume = 100.f : 0;
44  sound.setVolume(volume);
45  break;
46  }
47  case sf::Keyboard::Down: {
48  volume -= 10.f;
49  volume < .0f ? volume = 0.f : 0;
50  sound.setVolume(volume);
51  break;
52  }
53  default:
54  break;
55  }
56 }

◆ initFont()

void HUD::initFont ( )
private

Função de inicialização da fonte da interface

30  {
31  ImGui::GetIO().Fonts->Clear();
32  ImGui::GetIO().Fonts->AddFontFromFileTTF("./assets/font/Roboto-Regular.ttf",
33  18.f);
34  if (!ImGui::SFML::UpdateFontTexture()) {
35  throw std::runtime_error("Update Font Texture");
36  }
37 }

◆ initTexture()

void HUD::initTexture ( )
private

Função de inicialização dos icones

40  {
41  if (!play_tex.loadFromFile("./assets/img/icon/botao-play.png")) {
42  throw std::invalid_argument("Error Loading Texture Play");
43  }
44  if (!pause_tex.loadFromFile("./assets/img/icon/pausa.png")) {
45  throw std::invalid_argument("Error Loading Texture Pause");
46  }
47  if (!stop_tex.loadFromFile("./assets/img/icon/pare.png")) {
48  throw std::invalid_argument("Error Loading Texture Stop");
49  }
50  if (!forward_tex.loadFromFile("./assets/img/icon/avanco-rapido.png")) {
51  throw std::invalid_argument("Error Loading Texture Forward");
52  }
53  if (!backward_tex.loadFromFile("./assets/img/icon/retroceder.png")) {
54  throw std::invalid_argument("Error Loading Texture Backward");
55  }
56  if (!previous_tex.loadFromFile("./assets/img/icon/costas.png")) {
57  throw std::invalid_argument("Error Loading Texture Previous");
58  }
59  if (!next_tex.loadFromFile("./assets/img/icon/proximo.png")) {
60  throw std::invalid_argument("Error Loading Texture Next");
61  }
62  if (!mute_tex.loadFromFile("./assets/img/icon/mudo.png")) {
63  throw std::invalid_argument("Error Loading Texture Mute");
64  }
65  if (!volume_tex.loadFromFile("./assets/img/icon/volume.png")) {
66  throw std::invalid_argument("Error Loading Texture Volume");
67  }
68 }

◆ modeAudio()

void HUD::modeAudio ( )
private

Função para exibir opções de modo de áudio

124  {
125  ImGui::Text("Mode");
126  ImGui::Spacing();
127 
128  ImGui::RadioButton("NoFFT", &fftMode, 0);
129  ImGui::SameLine();
130  ImGui::RadioButton("FFT", &fftMode, 1);
131  ImGui::Spacing();
132  ImGui::RadioButton("Spectrum", &spectrumMode, 1);
133  ImGui::SameLine();
134  ImGui::RadioButton("Oscillation", &spectrumMode, 0);
135  ImGui::SameLine();
136  ImGui::RadioButton("Oscillation3D", &spectrumMode, 2);
137 
138  if (fftMode == 0) {
139  switch (spectrumMode) {
140  case 0:
141  option = 2;
142  break;
143  case 1:
144  option = 4;
145  break;
146  case 2:
147  option = 6;
148  break;
149  default:
150  break;
151  }
152  } else if (fftMode == 1) {
153  switch (spectrumMode) {
154  case 0:
155  option = 1;
156  break;
157  case 1:
158  option = 3;
159  break;
160  case 2:
161  option = 5;
162  break;
163  default:
164  break;
165  }
166  }
167 }
int fftMode
Definition: hud.hpp:28
int spectrumMode
Definition: hud.hpp:29
int option
Definition: hud.hpp:71

◆ openFileDialog()

void HUD::openFileDialog ( )
private

Implementação para abrir a caixa de diálogo e lidar com a seleção de arquivos de áudio

42  {
43  ImVec2 dialog_maxsize = ImVec2(HUD_WIDTH * 2.f, HUD_HEIGHT * 2.f);
44  ImGui::Text("Select Audio File");
45 
46  if (ImGui::Button("Select File")) {
47  const char *filter = "Audio File (*.flac,*.wav){.flac,.wav}";
48  IGFD::FileDialogConfig config;
49  config.path = "../audio";
50  config.sidePaneWidth = 450.0f;
51 
52  ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey",
53  "Choose File", filter, config);
54  }
55 
56  if (ImGuiFileDialog::Instance()->Display("ChooseFileDlgKey",
57  ImGuiWindowFlags_NoCollapse |
58  ImGuiWindowFlags_NoResize,
59  dialog_maxsize, dialog_maxsize)) {
60  if (ImGuiFileDialog::Instance()->IsOk()) {
61  std::string filePathName =
62  ImGuiFileDialog::Instance()->GetFilePathName();
63  if (list_audio.empty()) {
64  setSoundBuffer(filePathName);
65  }
66 
67  auto it =
68  std::find(list_audio.begin(), list_audio.end(), filePathName);
69  if (it == list_audio.end()) {
70  list_audio.push_back(filePathName);
71  } else {
72  setSoundBuffer(filePathName);
73  }
74  }
75 
76  ImGuiFileDialog::Instance()->Close();
77  }
78 }
const int HUD_HEIGHT
Definition: hud.hpp:12
const int HUD_WIDTH
Definition: hud.hpp:11

◆ playNextAudio()

void HUD::playNextAudio ( )
private

Função para reproduzir a próxima faixa de áudio na lista

91  {
92  if (!list_audio.empty()) {
93  selectedIndex = (selectedIndex + 1) % list_audio.size();
96  }
97 }

◆ playPreviousAudio()

void HUD::playPreviousAudio ( )
private

Função para reproduzir a faixa anterior de áudio na lista

100  {
101  if (!list_audio.empty()) {
102  selectedIndex =
103  (selectedIndex - 1 + list_audio.size()) % list_audio.size();
106  }
107 }

◆ resetControls()

void HUD::resetControls ( )
private

Função para resetar os controles de reprodução de áudio

110  {
111  isPlaying = false;
112  isMuted = false;
113  volume = 10.f;
114  sound.stop();
115  sound.setVolume(volume);
116 }

◆ run()

void HUD::run ( )

Executa o loop principal da interface gráfica.

82  {
83  ImGui::Begin("Audio HUD", nullptr,
84  ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove);
85  ImGui::SetWindowPos(ImVec2(0, 0));
86  ImGui::SetWindowSize(ImVec2(HUD_WIDTH, HUD_HEIGHT));
87 
88  ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[0]);
89 
90  ImGui::Separator();
92 
93  ImGui::SameLine();
94 
96 
97  ImGui::Spacing();
98  ImGui::Separator();
99  ImGui::Spacing();
100 
101  controlAudio();
102 
103  ImGui::Spacing();
104  ImGui::Separator();
105  ImGui::Spacing();
106 
107  modeAudio();
108 
109  ImGui::PopFont();
110  ImGui::End();
111 
112  ImGui::SFML::Render(*window);
113 }
void showAudioListWindow()
Definition: ui.cpp:185
void controlAudio()
Definition: ui.cpp:81
void modeAudio()
Definition: ui.cpp:124
void openFileDialog()
Definition: ui.cpp:42

◆ setSoundBuffer()

void HUD::setSoundBuffer ( const std::string &  filename)
private

Define o buffer de som a partir de um arquivo de áudio.

filename: O caminho do arquivo de áudio.

75  {
76  sound_buffer.loadFromFile(filename);
77  sound.setBuffer(sound_buffer);
78  resetControls();
79 }
void resetControls()
Definition: events.cpp:110
sf::SoundBuffer sound_buffer
Definition: hud.hpp:74

◆ showAudioListWindow()

void HUD::showAudioListWindow ( )
private

Função para exibir a janela de lista de áudio

185  {
186  if (ImGui::Button("Show Audio List")) {
188  }
189 
190  if (audioListWindow) {
191  ImGui::Begin("Audio List", nullptr,
192  ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove);
193  ImGui::SetWindowPos(ImVec2(HUD_WIDTH + 10, 0));
194  ImGui::SetWindowSize(ImVec2(HUD_WIDTH, HUD_HEIGHT - 100));
195 
196  audioList();
197 
198  ImGui::End();
199  }
200 }
void audioList()
Definition: ui.cpp:170
bool audioListWindow
Definition: hud.hpp:34

◆ skipBackward()

void HUD::skipBackward ( )
private

Função para retroceder a reprodução de áudio

84  {
85  sf::Time currentOffset = sound.getPlayingOffset();
86  sf::Time newOffset = currentOffset - sf::seconds(10.0f);
87  sound.setPlayingOffset(newOffset);
88 }

◆ skipForward()

void HUD::skipForward ( )
private

Função para avançar a reprodução de áudio

77  {
78  sf::Time currentOffset = sound.getPlayingOffset();
79  sf::Time newOffset = currentOffset + sf::seconds(10.0f);
80  sound.setPlayingOffset(newOffset);
81 }

◆ styleWidget()

void HUD::styleWidget ( )
private

Função para estilizar os elementos do ImGui

6  {
7  ImGuiStyle &style = ImGui::GetStyle();
8  // Window
9  style.WindowRounding = 5.3f;
10  style.FrameRounding = 2.3f;
11  style.ScrollbarRounding = 0;
12 
13  style.Colors[ImGuiCol_Text] = ImVec4(0.9f, 0.9f, 0.9f, 0.9f);
14  style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.6f, 0.6f, 0.6f, 1.0f);
15  style.Colors[ImGuiCol_WindowBg] = ImVec4(0.3f, 0.3f, 0.3f, 0.3f);
16  style.Colors[ImGuiCol_Border] = ImVec4(0.3f, 0.3f, 0.3f, 0.3f);
17  style.Colors[ImGuiCol_FrameBg] = ImVec4(0.0f, 0.0f, 0.1f, 1.0f);
18  style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.9f, 0.8f, 0.8f, 0.4f);
19  style.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.9f, 0.6f, 0.6f, 0.4f);
20  style.Colors[ImGuiCol_TitleBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.8f);
21  style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.1f, 0.1f, 0.1f, 0.8f);
22  // Botões
23  style.Colors[ImGuiCol_Button] = ImVec4(0.16f, 0.16f, 0.16f, 0.0f);
24  style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.16f, 0.16f, 0.16f, 0.5f);
25  style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.31f, 0.28f, 0.28f, 1.0f);
26  // Slider
27  style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.70f, 0.70f, 0.70f, 0.62f);
28  style.Colors[ImGuiCol_SliderGrabActive] =
29  ImVec4(0.30f, 0.30f, 0.30f, 0.84f);
30  // RadioButton
31  style.Colors[ImGuiCol_CheckMark] = ImVec4(0.90f, 0.90f, 0.90f, 0.83f);
32  // Header
33  style.Colors[ImGuiCol_Header] = ImVec4(0.12f, 0.12f, 0.12f, 1.0f);
34  style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.24f, 0.24f, 0.24f, 1.0f);
35  style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.31f, 0.31f, 0.31f, 1.0f);
36 }

◆ toggleMusicMute()

void HUD::toggleMusicMute ( )
private

Função que alterna o estado de mudo do áudio

59  {
60  isMuted = !isMuted;
61  sound.setVolume(isMuted ? 0.f : volume);
62 }

◆ toggleMusicPlayback()

void HUD::toggleMusicPlayback ( )
private

Função que alterna a reprodução de áudio

65  {
66  if (isPlaying) {
67  sound.pause();
68  isPlaying = false;
69  } else {
70  sound.play();
71  sound.setVolume(volume);
72  isPlaying = true;
73  }
74 }

Atributos

◆ audioListWindow

bool HUD::audioListWindow = false
private

◆ backward_tex

sf::Texture HUD::backward_tex
private

◆ fftMode

int HUD::fftMode = 0
private

◆ forward_tex

sf::Texture HUD::forward_tex
private

◆ icon_size

const float HUD::icon_size = 17.0f
private

◆ isMuted

bool HUD::isMuted = false
private

◆ isPlaying

bool HUD::isPlaying = false
private

◆ list_audio

std::vector<std::string> HUD::list_audio
private

◆ mute_tex

sf::Texture HUD::mute_tex
private

◆ next_tex

sf::Texture HUD::next_tex
private

◆ option

int HUD::option = 3

◆ pause_tex

sf::Texture HUD::pause_tex
private

◆ play_tex

sf::Texture HUD::play_tex
private

◆ previous_tex

sf::Texture HUD::previous_tex
private

◆ sample_buffer

std::vector<sf::Int16> HUD::sample_buffer

◆ selectedIndex

std::size_t HUD::selectedIndex = 0
private

◆ sound

sf::Sound HUD::sound

◆ sound_buffer

sf::SoundBuffer HUD::sound_buffer

◆ spectrumMode

int HUD::spectrumMode = 0
private

◆ stop_tex

sf::Texture HUD::stop_tex
private

◆ volume

float HUD::volume = 10.f
private

◆ volume_tex

sf::Texture HUD::volume_tex
private

◆ window

std::shared_ptr<sf::RenderWindow> HUD::window
private

A documentação para essa classe foi gerada a partir dos seguintes arquivos: