Files
sound-scope/scope.cpp
2026-03-27 10:26:47 -07:00

205 lines
5.4 KiB
C++

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_timer.h>
#include <SDL2/SDL_ttf.h>
#include <stdio.h>
#include <cmath>
#include <unistd.h>
#include <iostream>
#include <sys/time.h>
#include <chrono>
#include "scope.h"
// Main window size (location is 0, 0)
int x_window_size = 0;
int y_window_size = 0;
char input_our_audio_device_name[100];
main_window_class *my_main_window = NULL;
audio_window_class *my_audio_window = NULL;
spectrum_window_class *my_spectrum_window = NULL;
piano_window_class *my_piano_window = NULL;
main_buffer_manager_class *my_main_buffer_manager = NULL;
audio_buffer_manager_class *my_audio_buffer_manager = NULL;
spectrum_buffer_manager_class *my_spectrum_buffer_manager = NULL;
piano_process_class *my_piano_process = NULL;
struct piano_data_struct *piano_data_pointer=NULL;
Uint64 last_time;
Uint64 this_time;
// SDL Event to stop application on pressing a key on the keyboard
SDL_Event my_event;
int get_me_out = 0;
int main(int argc, char *argv[])
{
// function result
int main_function_result = 0;
// Get parameters for size
if (argc < 3)
{
printf ("needs x and y size \n");
exit (0);
}
x_window_size = atoi(argv[1]);
y_window_size = atoi(argv[2]);
int our_audio_trace_width;
int our_audio_trace_height;
int our_spectrum_trace_width;
int our_spectrum_trace_height;
Sint16 *my_main_buffer;
int *return_audio_buffer;
int *return_spectrum_buffer;
printf ("window is %d by %d\n", x_window_size, y_window_size);
// returns zero on success else non-zero
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
printf("error initializing SDL: %s\n", SDL_GetError());
}
// returns zero on success else non-zero
if (TTF_Init() != 0 ){
printf("error initializing TTF: %s\n", SDL_GetError());
}
// Windows
my_main_window = new main_window_class(x_window_size, y_window_size);
my_audio_window = new audio_window_class(x_window_size, y_window_size);
my_spectrum_window = new spectrum_window_class(x_window_size, y_window_size);
my_piano_window = new piano_window_class(x_window_size, y_window_size);
// main buffer
my_main_buffer_manager = new main_buffer_manager_class();
// audio_buffer
my_audio_buffer_manager = new audio_buffer_manager_class();
// spectrum buffer
my_spectrum_buffer_manager = new spectrum_buffer_manager_class();
// piano_process
my_piano_process = new piano_process_class();
// audio window width and height
our_audio_trace_width = my_audio_window->get_max_audio_trace_width();
our_audio_trace_height = my_audio_window->get_max_audio_trace_height();
// spectrum window width and height
our_spectrum_trace_width = my_spectrum_window->get_max_spectrum_trace_width();
our_spectrum_trace_height = my_spectrum_window->get_max_spectrum_trace_height();
// buffer initializations
my_main_buffer = my_main_buffer_manager->initial_preparation();
if (my_main_buffer == NULL)
{
printf("error initialize main_buffer\n");
exit (0);
}
main_function_result = my_audio_buffer_manager->initialize_audio
(our_audio_trace_width, our_audio_trace_height, my_main_buffer);
if (main_function_result)
{
printf("error initialize audio_buffer\n");
exit (0);
}
main_function_result = my_spectrum_buffer_manager->initialize_spectrum
(our_spectrum_trace_width, our_spectrum_trace_height, my_main_buffer);
if (main_function_result)
{
printf("error initialize spectrum_buffer\n");
exit (0);
}
//Initialize Piano Data Processor
main_function_result = my_piano_process->initialize_piano_data();
if (main_function_result)
{
printf("error initialize piano processing\n");
exit (0);
}
//Read and process and display loop
last_time = 0;
while (get_me_out == 0) {
while(SDL_PollEvent(&my_event)) {
printf("got event event type is %d\n", my_event.type);
switch (my_event.type) {
case SDL_QUIT: get_me_out = 1;
case SDL_KEYDOWN: get_me_out = 1;
break;
}
}
// SDL_Delay(100);
my_main_buffer = my_main_buffer_manager->read_main_buffer();
if (my_main_buffer == NULL)
{
printf("error resding into main_buffer\n");
exit (0);
}
return_audio_buffer = my_audio_buffer_manager->process_audio();
if (return_audio_buffer == NULL)
{
printf("error processing audio to return_audio_buffer\n");
exit (0);
}
return_spectrum_buffer = my_spectrum_buffer_manager->process_spectrum();
//gettimeofday(&stop_time, NULL);
//gettimeofday(&start_time, NULL);
this_time = SDL_GetTicks64();
if (this_time >= last_time)
{
while ((last_time + FRAME_TIME) > this_time)
{
usleep(1000);
this_time = SDL_GetTicks64();
}
}
last_time = this_time;
main_function_result = my_audio_window->draw_trace(return_audio_buffer,
our_audio_trace_width);
// display fft only when the entire fft buffer is done
if (return_spectrum_buffer != NULL)
{
main_function_result = my_spectrum_window->draw_trace(return_spectrum_buffer,
our_spectrum_trace_width);
}
// Piano section
piano_data_pointer = my_piano_process->process_piano_data(my_main_buffer);
if (piano_data_pointer == NULL)
{
printf("piano not done\n");
}
else
{
printf ("piano done\n");
my_piano_window->draw_trace(piano_data_pointer);
}
}
return main_function_result;
}