-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathAudioReader.cpp
More file actions
73 lines (63 loc) · 2.4 KB
/
Copy pathAudioReader.cpp
File metadata and controls
73 lines (63 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "AudioReader.hpp"
#include <AvTranscoder/util.hpp>
#include <AvTranscoder/decoder/AudioDecoder.hpp>
#include <AvTranscoder/decoder/AudioGenerator.hpp>
#include <AvTranscoder/data/decoded/AudioFrame.hpp>
#include <AvTranscoder/transform/AudioTransform.hpp>
#include <AvTranscoder/progress/NoDisplayProgress.hpp>
namespace avtranscoder
{
AudioReader::AudioReader(const InputStreamDesc& inputDesc)
: IReader(inputDesc)
, _audioStreamProperties(NULL)
, _outputSampleRate(0)
, _outputNbChannels(0)
, _outputSampleFormat(AV_SAMPLE_FMT_S16)
{
init();
}
void AudioReader::init()
{
// analyse InputFile
avtranscoder::NoDisplayProgress p;
_inputFile->analyse(p);
_streamProperties = &_inputFile->getProperties().getStreamPropertiesWithIndex(_inputDesc._streamIndex);
_audioStreamProperties = static_cast<const AudioProperties*>(_streamProperties);
_inputFile->activateStream(_inputDesc._streamIndex);
// setup decoder
_decoder = new AudioDecoder(_inputFile->getStream(_inputDesc._streamIndex));
_decoder->setupDecoder();
_currentDecoder = _decoder;
// create src frame
AudioFrameDesc srcFrameDesc = _inputFile->getStream(_inputDesc._streamIndex).getAudioCodec().getAudioFrameDesc();
if(! _inputDesc._channelIndexArray.empty())
srcFrameDesc._nbChannels = _inputDesc._channelIndexArray.size();
_srcFrame = new AudioFrame(srcFrameDesc, false);
AudioFrame* srcFrame = static_cast<AudioFrame*>(_srcFrame);
// create dst frame
_outputSampleRate = srcFrame->getSampleRate();
_outputNbChannels = srcFrame->getNbChannels();
_dstFrame = new AudioFrame(AudioFrameDesc(_outputSampleRate, _outputNbChannels, getSampleFormatName(_outputSampleFormat)));
// generator
_generator = new AudioGenerator(srcFrameDesc);
// create transform
_transform = new AudioTransform();
}
AudioReader::~AudioReader()
{
delete _decoder;
delete _generator;
delete _srcFrame;
delete _dstFrame;
delete _transform;
}
void AudioReader::updateOutput(const size_t sampleRate, const size_t nbChannels, const std::string& sampleFormat)
{
_outputSampleRate = sampleRate;
_outputNbChannels = nbChannels;
_outputSampleFormat = getAVSampleFormat(sampleFormat);
// update dst frame
delete _dstFrame;
_dstFrame = new AudioFrame(AudioFrameDesc(_outputSampleRate, _outputNbChannels, getSampleFormatName(_outputSampleFormat)));
}
}