/* * AudioFile.cpp * * Created on: 6 déc. 2023 * Author: fanch */ #include "AudioFile.h" #include #include #include #include #include #include "errors.h" #include "cmath" #include "Window.h" void default_audio_file_option(AudioFileOption* out){ out->time_per_window = 1/30.0; // 30 fps out->buffer_size = 2<<24; // 32 Mo } AudioFile::~AudioFile() { } AudioFile::AudioFile(const std::string& filename) { m_buffer = NULL; m_buffer_start = m_buffer_end = -1; m_fd = fopen(filename.c_str(), "r"); if(!m_fd){ std::string err = std::string("Erreur impossible de lire le fichier")+filename+")"; throw FileNotFoundError(err); } _init(); } AudioFile::AudioFile(FILE* fd){ m_buffer = NULL; m_buffer_start = m_buffer_end = -1; m_fd = fd; _init(); } char* AudioFile::_base_read(size_t size, size_t count, char* buffer){ size_t readed=0; if((readed=fread(buffer, size, count, m_fd))!=count){ printf("Deamndé : %ld lu %ld\n",size*count, readed ); throw IOError(strerror(errno)); } return buffer; } void AudioFile::_init(){ default_audio_file_option(&m_options); _base_read(sizeof(m_header), 1, (char*)&m_header); fseek(m_fd, 0, SEEK_END); int total = ftell(m_fd) - sizeof(m_header); m_total_time = total / ((float)m_header.byte_per_sec); } int8_t* AudioFile::_bufferize(size_t start){ size_t end = start + m_options.time_per_window * m_header.bit_per_sample * m_header.sample_rate; const int byte_per_sample = m_header.bit_per_sample>>3; if(start>=m_buffer_start && start=m_buffer_start && end m_header.data_size){ to_read = m_header.data_size-start; } fread(m_buffer, byte_per_sample, m_options.buffer_size/byte_per_sample, m_fd); return m_buffer; } Window** AudioFile::window_at_time(float time) { if(time>m_total_time) return NULL; Window** windows = new Window*[m_header.channels]; size_t sample_per_window = m_options.time_per_window * m_header.bit_per_sample * m_header.sample_rate; for(size_t i=0; i> 3; size_t start = sample_size * m_header.sample_rate * m_header.channels * time; printf("For time %f offset = %ld + %ld\n", time, sizeof(m_header), start); int8_t* buffer = _bufferize(start); for(size_t i=0; idata[i] = _val_to_float(buffer+(i*m_header.channels+channel)*sample_size, sample_size); } } return windows; } Window* AudioFile::window_channel_at_time(float time, int ch) { if(time>m_total_time) return NULL; size_t sample_per_window = m_options.time_per_window * m_header.bit_per_sample * m_header.sample_rate; Window* windows = new Window(this, sample_per_window); size_t sample_size = m_header.bit_per_sample >> 3; size_t start = sample_size * m_header.sample_rate * m_header.channels * time; printf("For time %f offset = %ld + %ld\n", time, sizeof(m_header), start); int8_t* buffer = _bufferize(start); for(size_t i=0; idata[i] = _val_to_float(buffer+(i*m_header.channels+channel)*sample_size, sample_size); } } return windows; }