123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /*
- * AudioFile.cpp
- *
- * Created on: 6 déc. 2023
- * Author: fanch
- */
- #include "AudioFile.h"
- #include <unistd.h>
- #include <cstring>
- #include <fcntl.h>
- #include <errno.h>
- #include <cstdio>
- #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_end && end>=m_buffer_start && end<m_buffer_end){
- return &m_buffer[start - m_buffer_start];
- }
- if(m_buffer) delete[] m_buffer;
- m_buffer = new int8_t[m_options.buffer_size];
- fseek(m_fd, sizeof(m_header) + start, SEEK_SET);
- int to_read = m_options.buffer_size/byte_per_sample;
- if(start+to_read > 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<m_header.channels; i++)
- windows[i] = 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; i<sample_per_window; i++){
- for(size_t channel=0; channel<m_header.channels; channel++){
- windows[channel]->data[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; i<sample_per_window; i++){
- for(size_t channel=0; channel<m_header.channels; channel++){
- if(channel != (uint8_t)ch) continue;
- windows->data[i] = _val_to_float(buffer+(i*m_header.channels+channel)*sample_size, sample_size);
- }
- }
- return windows;
- }
|