Line data Source code
1 : /* 2 : * Copyright (C) 2004-2024 Savoir-faire Linux Inc. 3 : * 4 : * This program is free software: you can redistribute it and/or modify 5 : * it under the terms of the GNU General Public License as published by 6 : * the Free Software Foundation, either version 3 of the License, or 7 : * (at your option) any later version. 8 : * 9 : * This program is distributed in the hope that it will be useful, 10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 : * GNU General Public License for more details. 13 : * 14 : * You should have received a copy of the GNU General Public License 15 : * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 : */ 17 : #pragma once 18 : 19 : extern "C" { 20 : #include <libavutil/samplefmt.h> 21 : } 22 : 23 : #include <fmt/core.h> 24 : #include <sstream> 25 : #include <string> 26 : #include <cstddef> // for size_t 27 : 28 : namespace jami { 29 : 30 : /** 31 : * Structure to hold sample rate and channel number associated with audio data. 32 : */ 33 : struct AudioFormat 34 : { 35 : unsigned sample_rate; 36 : unsigned nb_channels; 37 : AVSampleFormat sampleFormat; 38 : 39 2674 : constexpr AudioFormat(unsigned sr, unsigned c, AVSampleFormat f = AV_SAMPLE_FMT_S16) 40 2674 : : sample_rate(sr) 41 2674 : , nb_channels(c) 42 2674 : , sampleFormat(f) 43 2674 : {} 44 : 45 426 : inline bool operator==(const AudioFormat& b) const 46 : { 47 236 : return ((b.sample_rate == sample_rate) && (b.nb_channels == nb_channels) 48 662 : && (b.sampleFormat == sampleFormat)); 49 : } 50 : 51 311 : inline bool operator!=(const AudioFormat& b) const { return !(*this == b); } 52 : 53 115 : inline std::string toString() const 54 : { 55 230 : return fmt::format("{{{}, {} channels, {}Hz}}", av_get_sample_fmt_name(sampleFormat), nb_channels, sample_rate); 56 : } 57 : 58 0 : inline AudioFormat withSampleFormat(AVSampleFormat format) 59 : { 60 0 : return {sample_rate, nb_channels, format}; 61 : } 62 : 63 : 64 : /** 65 : * Returns bytes necessary to hold one frame of audio data. 66 : */ 67 : inline size_t getBytesPerFrame() const { return av_get_bytes_per_sample(sampleFormat) * nb_channels; } 68 : 69 : /** 70 : * Bytes per second (default), or bytes necessary 71 : * to hold delay_ms milliseconds of audio data. 72 : */ 73 : inline size_t getBandwidth(unsigned delay_ms = 1000) const 74 : { 75 : return (getBytesPerFrame() * sample_rate * delay_ms) / 1000; 76 : } 77 : 78 : static const constexpr unsigned DEFAULT_SAMPLE_RATE = 48000; 79 38 : static const constexpr AudioFormat DEFAULT() { return AudioFormat {16000, 1}; } 80 : static const constexpr AudioFormat NONE() { return AudioFormat {0, 0}; } 81 4 : static const constexpr AudioFormat MONO() { return AudioFormat {DEFAULT_SAMPLE_RATE, 1}; } 82 4 : static const constexpr AudioFormat STEREO() { return AudioFormat {DEFAULT_SAMPLE_RATE, 2}; } 83 : }; 84 : 85 : } // namespace jami