本文整理汇总了C++中AudioDecoder类的典型用法代码示例。如果您正苦于以下问题:C++ AudioDecoder类的具体用法?C++ AudioDecoder怎么用?C++ AudioDecoder使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了AudioDecoder类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: qDebug
void AudioPluginCache::load(const QDir &dir)
{
qDebug() << Q_FUNC_INFO << dir.path();
/* Check that we can access the directory */
if (dir.exists() == false || dir.isReadable() == false)
return;
/* Loop through all files in the directory */
QStringListIterator it(dir.entryList());
while (it.hasNext() == true)
{
/* Attempt to load a plugin from the path */
QString fileName(it.next());
QString path = dir.absoluteFilePath(fileName);
QPluginLoader loader(path, this);
AudioDecoder* ptr = qobject_cast<AudioDecoder*> (loader.instance());
if (ptr != NULL)
{
qDebug() << "Loaded audio decoder plugin from" << fileName;
/* Just append the plugin path to be used at runtime
* for dynamic creation of instances */
ptr->initialize("");
m_pluginsPathList << path;
loader.unload();
}
else
qDebug() << "Failed to load plugin: " << loader.errorString();
}
}
示例2: CreateDecoderForInputSource
AudioDecoder * AudioDecoder::CreateDecoderForInputSourceRegion(InputSource *inputSource, SInt64 startingFrame, UInt32 frameCount, UInt32 repeatCount, CFErrorRef *error)
{
if(NULL == inputSource)
return NULL;
if(!inputSource->SupportsSeeking())
return NULL;
AudioDecoder *decoder = CreateDecoderForInputSource(inputSource, error);
if(NULL == decoder)
return NULL;
if(!decoder->SupportsSeeking()) {
delete decoder, decoder = NULL;
return NULL;
}
AudioDecoder *regionDecoder = CreateDecoderForDecoderRegion(decoder, startingFrame, frameCount, repeatCount, error);
if(NULL == regionDecoder) {
delete decoder, decoder = NULL;
return NULL;
}
return regionDecoder;
}
示例3: CreateDecoderForInputSource
AudioDecoder * AudioDecoder::CreateDecoderForInputSourceRegion(InputSource *inputSource, SInt64 startingFrame, CFErrorRef *error)
{
if(nullptr == inputSource)
return nullptr;
if(!inputSource->SupportsSeeking())
return nullptr;
AudioDecoder *decoder = CreateDecoderForInputSource(inputSource, error);
if(nullptr == decoder)
return nullptr;
if(!decoder->SupportsSeeking()) {
delete decoder, decoder = nullptr;
return nullptr;
}
AudioDecoder *regionDecoder = CreateDecoderForDecoderRegion(decoder, startingFrame, error);
if(nullptr == regionDecoder) {
delete decoder, decoder = nullptr;
return nullptr;
}
return regionDecoder;
}
示例4: contextMenuEvent
void AudioItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *)
{
QMenu menu;
QFont menuFont = qApp->font();
menuFont.setPixelSize(14);
menu.setFont(menuFont);
if (m_audio->getAudioDecoder() != NULL)
{
AudioDecoder *ad = m_audio->getAudioDecoder();
AudioParameters ap = ad->audioParameters();
if (ap.channels() == 1)
m_previewLeftAction->setText(tr("Preview Mono"));
menu.addAction(m_previewLeftAction);
if (ap.channels() == 2)
{
m_previewLeftAction->setText(tr("Preview Left Channel"));
menu.addAction(m_previewRightAction);
menu.addAction(m_previewStereoAction);
}
menu.addSeparator();
}
foreach(QAction *action, getDefaultActions())
menu.addAction(action);
menu.exec(QCursor::pos());
}
示例5: dialog
void AudioEditor::slotSourceFileClicked()
{
QString fn;
/* Create a file open dialog */
QFileDialog dialog(this);
dialog.setWindowTitle(tr("Open Audio File"));
dialog.setAcceptMode(QFileDialog::AcceptOpen);
/* Append file filters to the dialog */
QStringList extList = Audio::getCapabilities();
QStringList filters;
qDebug() << Q_FUNC_INFO << "Extensions: " << extList.join(" ");
filters << tr("Audio Files (%1)").arg(extList.join(" "));
#if defined(WIN32) || defined(Q_OS_WIN)
filters << tr("All Files (*.*)");
#else
filters << tr("All Files (*)");
#endif
dialog.setNameFilters(filters);
/* Append useful URLs to the dialog */
QList <QUrl> sidebar;
sidebar.append(QUrl::fromLocalFile(QDir::homePath()));
sidebar.append(QUrl::fromLocalFile(QDir::rootPath()));
dialog.setSidebarUrls(sidebar);
/* Get file name */
if (dialog.exec() != QDialog::Accepted)
return;
fn = dialog.selectedFiles().first();
if (fn.isEmpty() == true)
return;
if (m_audio->isRunning())
m_audio->stopAndWait();
m_audio->setSourceFileName(fn);
m_filenameLabel->setText(m_audio->getSourceFileName());
AudioDecoder *adec = m_audio->getAudioDecoder();
if (adec != NULL)
{
AudioParameters ap = adec->audioParameters();
m_durationLabel->setText(Function::speedToString(m_audio->getDuration()));
m_srateLabel->setText(QString("%1 Hz").arg(ap.sampleRate()));
m_channelsLabel->setText(QString("%1").arg(ap.channels()));
m_bitrateLabel->setText(QString("%1 kb/s").arg(adec->bitrate()));
}
}
示例6: foreach
QStringList AudioPluginCache::getSupportedFormats()
{
QStringList caps;
foreach(QString path, m_pluginsPathList)
{
QPluginLoader loader(path, this);
AudioDecoder* ptr = qobject_cast<AudioDecoder*> (loader.instance());
if (ptr != NULL)
{
ptr->initialize("");
caps << ptr->supportedFormats();
loader.unload();
}
}
示例7: QVariant
QVariant AudioEditor::mediaInfo() const
{
QVariantMap infoMap;
if (m_audio == nullptr)
return QVariant();
AudioDecoder *adec = m_audio->getAudioDecoder();
if (adec == nullptr)
return QVariant();
AudioParameters ap = adec->audioParameters();
infoMap.insert("duration", Function::speedToString(m_audio->totalDuration()));
infoMap.insert("sampleRate", QString("%1 Hz").arg(ap.sampleRate()));
infoMap.insert("channels", ap.channels());
infoMap.insert("bitrate", QString("%1 kb/s").arg(adec->bitrate()));
return QVariant::fromValue(infoMap);
}
示例8: contextMenuEvent
void AudioItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *)
{
QMenu menu;
QFont menuFont = qApp->font();
menuFont.setPixelSize(14);
menu.setFont(menuFont);
if (m_audio->getAudioDecoder() != NULL)
{
AudioDecoder *ad = m_audio->getAudioDecoder();
AudioParameters ap = ad->audioParameters();
if (ap.channels() == 1)
m_previewLeftAction->setText(tr("Preview Mono"));
menu.addAction(m_previewLeftAction);
if (ap.channels() == 2)
{
m_previewLeftAction->setText(tr("Preview Left Channel"));
menu.addAction(m_previewRightAction);
menu.addAction(m_previewStereoAction);
}
menu.addSeparator();
}
menu.addAction(m_alignToCursor);
if (isLocked())
{
m_lockAction->setText(tr("Unlock item"));
m_lockAction->setIcon(QIcon(":/unlock.png"));
}
else
{
m_lockAction->setText(tr("Lock item"));
m_lockAction->setIcon(QIcon(":/lock.png"));
}
menu.addAction(m_lockAction);
menu.exec(QCursor::pos());
}
示例9: fclose
void Psp2Audio::SE_Play(std::string const& file, int volume, int pitch) {
// Opening file
FILE* stream = FileFinder::fopenUTF8(file, "rb");
if (!stream) {
Output::Warning("Couldn't open sound file %s", file.c_str());
return;
}
// Pick the next free SE slot.
// Does not need synchronisation
int idx = -1;
for (int i = 0; i < AUDIO_CHANNELS; ++i) {
if (sfx_sounds[i].isPlaying && sfx_sounds[i].isFinished) {
idx = i;
break;
}
}
if (idx == -1) {
fclose(stream);
Output::Warning("SE: No free channels available (%s)", file.c_str());
return;
}
DecodedSound& sfx = sfx_sounds[idx];
sfx.decoder = AudioDecoder::Create(stream, file);
if (sfx.decoder == nullptr){
fclose(stream);
Output::Warning("Unsupported sound format (%s)", file.c_str());
return;
}
// Initializing internal audio decoder
int audiotype;
AudioDecoder* decoder = sfx.decoder.get();
if (!decoder->Open(stream)) {
Output::Warning("Error occured in audio decoder (%s)", audio_decoder->GetError().c_str());
return;
}
decoder->SetLooping(false);
AudioDecoder::Format int_format;
int samplerate;
decoder->SetFormat(48000, AudioDecoder::Format::S16, 2);
decoder->GetFormat(samplerate, int_format, audiotype);
if (samplerate != 48000) Output::Warning("Cannot resample sound file. Sound will be distorted.");
// Check for file audiocodec
sfx.isStereo = audiotype == 2;
// Setting default streaming values
sfx.cur_audiobuf = sfx.audiobuf;
decoder->SetPitch(pitch);
decoder->SetVolume(volume);
// Wait and signal is required to prevent reordering
sceKernelWaitSema(SFX_Mutex_ID, 1, NULL);
sfx.isPlaying = false;
sfx.isFinished = false;
sceKernelSignalSema(SFX_Mutex_ID, 1);
// Start one SE thread
sceKernelSignalSema(SFX_Mutex, 1);
}
示例10: DPTR_D
//TODO: if output is null or dummy, the use duration to wait
void AudioThread::run()
{
DPTR_D(AudioThread);
//No decoder or output. No audio output is ok, just display picture
if (!d.dec || !d.dec->isAvailable())
return;
resetState();
Q_ASSERT(d.clock != 0);
AudioDecoder *dec = static_cast<AudioDecoder*>(d.dec);
AudioOutput *ao = static_cast<AudioOutput*>(d.writer);
int sample_rate = dec->codecContext()->sample_rate;
int channels = dec->codecContext()->channels;
int csf = channels * sample_rate * sizeof(float);
static const double max_len = 0.02;
d.last_pts = 0;
while (!d.stop) {
//TODO: why put it at the end of loop then playNextFrame() not work?
if (tryPause()) { //DO NOT continue, or playNextFrame() will fail
if (d.stop)
break; //the queue is empty and may block. should setBlocking(false) wake up cond empty?
}
QMutexLocker locker(&d.mutex);
Q_UNUSED(locker);
if (d.packets.isEmpty() && !d.stop) {
d.stop = d.demux_end;
if (d.stop) {
break;
}
}
Packet pkt = d.packets.take(); //wait to dequeue
if (!pkt.isValid()) {
qDebug("Invalid packet! flush audio codec context!!!!!!!!");
dec->flush();
continue;
}
d.clock->updateValue(pkt.pts);
//DO NOT decode and convert if ao is not available or mute!
if (dec->decode(pkt.data)) {
QByteArray decoded(dec->data());
int decodedSize = decoded.size();
int decodedPos = 0;
qreal delay =0;
while (decodedSize > 0) {
int chunk = qMin(decodedSize, int(max_len*csf));
d.clock->updateDelay(delay += (qreal)chunk/(qreal)csf);
QByteArray decodedChunk(chunk, 0); //volume == 0 || mute
if (ao && ao->isAvailable()) {
if (!ao->isMute()) {
decodedChunk = QByteArray::fromRawData(decoded.constData() + decodedPos, chunk);
qreal vol = ao->volume();
if (vol != 1.0) {
int len = decodedChunk.size()/sizeof(float); //TODO: why???
float *data = (float*)decodedChunk.data();
for (int i = 0; i < len; ++i)
data[i] *= vol;
}
}
ao->writeData(decodedChunk);
} else {
/*
* why need this even if we add delay? and usleep sounds weird
* the advantage is if no audio device, the play speed is ok too
* So is portaudio blocking the thread when playing?
*/
static bool sWarn_no_ao = true; //FIXME: no warning when replay. warn only once
if (sWarn_no_ao) {
qDebug("Audio output not available! msleep(%lu)", (unsigned long)((qreal)chunk/(qreal)csf * 1000));
sWarn_no_ao = false;
}
//TODO: avoid acummulative error. External clock?
msleep((unsigned long)((qreal)chunk/(qreal)csf * 1000.0));
}
decodedPos += chunk;
decodedSize -= chunk;
}
} else {
//qWarning("Decode audio failed");
qreal dt = pkt.pts - d.last_pts;
if (abs(dt) > 0.618 || dt < 0) {
dt = 0;
}
//qDebug("sleep %f", dt);
//TODO: avoid acummulative error. External clock?
msleep((unsigned long)(dt*1000.0));
}
d.last_pts = d.clock->value(); //not pkt.pts! the delay is updated!
}
qDebug("Audio thread stops running...");
}
示例11: createWaveform
void AudioItem::createWaveform(bool left, bool right)
{
if ((left == true || right == true) && m_audio->getAudioDecoder() != NULL)
{
AudioDecoder *ad = m_audio->getAudioDecoder();
AudioParameters ap = ad->audioParameters();
// 1- find out how many samples have to be represented on a single pixel on a 1:1 time scale
int sampleSize = ap.sampleSize();
int channels = ap.channels();
int oneSecondSamples = ap.sampleRate() * channels;
int onePixelSamples = oneSecondSamples / 50;
//qint32 maxValue = qPow(0xFF, sampleSize);
qint32 maxValue = 0;
if (left == true && right == true)
maxValue = 0x7F << (8 * (sampleSize - 1));
else
maxValue = 0x3F << (8 * (sampleSize - 1));
quint32 defaultDataLen = onePixelSamples * sampleSize;
// 2- decode the whole file and fill a QPixmap with a sample block RMS value for each pixel
qint64 dataRead = 1;
unsigned char audioData[defaultDataLen * 4];
quint32 audioDataOffset = 0;
m_preview = new QPixmap((50 * m_audio->totalDuration()) / 1000, 76);
m_preview->fill(Qt::transparent);
QPainter p(m_preview);
int xpos = 0;
qDebug() << "Audio duration: " << m_audio->totalDuration() <<
", pixmap width: " << ((50 * m_audio->totalDuration()) / 1000) <<
", maxValue: " << maxValue;
qDebug() << "Samples per second: " << oneSecondSamples << ", for one pixel: " << onePixelSamples;
while (dataRead)
{
quint32 tmpExceedData = 0;
if (audioDataOffset < defaultDataLen)
{
dataRead = ad->read((char *)audioData + audioDataOffset, defaultDataLen * 2);
if (dataRead > 0)
{
if(dataRead + audioDataOffset >= defaultDataLen)
{
tmpExceedData = dataRead + audioDataOffset - defaultDataLen;
dataRead = defaultDataLen;
}
else
{
audioDataOffset = dataRead;
continue;
}
}
}
else
{
dataRead = defaultDataLen;
tmpExceedData = audioDataOffset - defaultDataLen;
}
if (dataRead > 0)
{
quint32 i = 0;
// calculate the RMS value (peak) for this data block
double rmsLeft = 0;
double rmsRight = 0;
bool done = false;
while (!done)
{
if (left == true)
{
qint32 sampleVal = getSample(audioData, &i, sampleSize);
rmsLeft += (sampleVal * sampleVal);
}
if (channels == 2)
{
if (right == true)
{
qint32 sampleVal = getSample(audioData, &i, sampleSize);
rmsRight += (sampleVal * sampleVal);
}
else
getSample(audioData, &i, sampleSize); // got to read it anyway and discard data
}
if (i >= dataRead / sampleSize)
done = true;
}
quint32 divisor = (dataRead / sampleSize) / channels;
if (left == true)
rmsLeft = sqrt(rmsLeft / divisor);
if (right == true)
rmsRight = sqrt(rmsRight / divisor);
// 3- Draw the actual waveform
unsigned short lineHeightLeft = 0, lineHeightRight = 0;
if (left == true)
lineHeightLeft = (76 * rmsLeft) / maxValue;
if (right == true)
lineHeightRight = (76 * rmsRight) / maxValue;
//.........这里部分代码省略.........
示例12: DPTR_D
/*
*TODO:
* if output is null or dummy, the use duration to wait
*/
void AudioThread::run()
{
DPTR_D(AudioThread);
//No decoder or output. No audio output is ok, just display picture
if (!d.dec || !d.dec->isAvailable() || !d.outputSet)
return;
resetState();
Q_ASSERT(d.clock != 0);
AudioDecoder *dec = static_cast<AudioDecoder*>(d.dec);
AudioOutput *ao = 0;
// first() is not null even if list empty
if (!d.outputSet->outputs().isEmpty())
ao = static_cast<AudioOutput*>(d.outputSet->outputs().first()); //TODO: not here
d.init();
//TODO: bool need_sync in private class
bool is_external_clock = d.clock->clockType() == AVClock::ExternalClock;
Packet pkt;
while (!d.stop) {
processNextTask();
//TODO: why put it at the end of loop then playNextFrame() not work?
if (tryPause()) { //DO NOT continue, or playNextFrame() will fail
if (d.stop)
break; //the queue is empty and may block. should setBlocking(false) wake up cond empty?
} else {
if (isPaused())
continue;
}
if (d.packets.isEmpty() && !d.stop) {
d.stop = d.demux_end;
}
if (d.stop) {
qDebug("audio thread stop before take packet");
break;
}
if (!pkt.isValid()) {
pkt = d.packets.take(); //wait to dequeue
}
if (!pkt.isValid()) {
qDebug("Invalid packet! flush audio codec context!!!!!!!! audio queue size=%d", d.packets.size());
dec->flush();
continue;
}
bool skip_render = pkt.pts < d.render_pts0;
// audio has no key frame, skip rendering equals to skip decoding
if (skip_render) {
d.clock->updateValue(pkt.pts);
/*
* audio may be too fast than video if skip without sleep
* a frame is about 20ms. sleep time must be << frame time
*/
qreal a_v = pkt.pts - d.clock->videoPts();
//qDebug("skip audio decode at %f/%f v=%f a-v=%f", pkt.pts, d.render_pts0, d.clock->videoPts(), a_v);
if (a_v > 0)
msleep(qMin((ulong)300, ulong(a_v*1000.0)));
else
msleep(2);
pkt = Packet(); //mark invalid to take next
continue;
}
d.render_pts0 = 0;
if (is_external_clock) {
d.delay = pkt.pts - d.clock->value();
/*
*after seeking forward, a packet may be the old, v packet may be
*the new packet, then the d.delay is very large, omit it.
*TODO: 1. how to choose the value
* 2. use last delay when seeking
*/
if (qAbs(d.delay) < 2.718) {
if (d.delay < -kSyncThreshold) { //Speed up. drop frame?
//continue;
}
while (d.delay > kSyncThreshold) { //Slow down
//d.delay_cond.wait(&d.mutex, d.delay*1000); //replay may fail. why?
//qDebug("~~~~~wating for %f msecs", d.delay*1000);
usleep(kSyncThreshold * 1000000UL);
if (d.stop)
d.delay = 0;
else
d.delay -= kSyncThreshold;
}
if (d.delay > 0)
usleep(d.delay * 1000000UL);
} else { //when to drop off?
if (d.delay > 0) {
msleep(64);
} else {
//audio packet not cleaned up?
continue;
}
}
} else {
d.clock->updateValue(pkt.pts);
}
//DO NOT decode and convert if ao is not available or mute!
//.........这里部分代码省略.........
示例13: FLACDecoder
AudioDecoder * AudioDecoder::CreateDecoderForInputSource(InputSource *inputSource, CFStringRef mimeType, CFErrorRef *error)
{
if(NULL == inputSource)
return NULL;
AudioDecoder *decoder = NULL;
// Open the input source if it isn't already
if(AutomaticallyOpenDecoders() && !inputSource->IsOpen() && !inputSource->Open(error))
return NULL;
// As a factory this class has knowledge of its subclasses
// It would be possible (and perhaps preferable) to switch to a generic
// plugin interface at a later date
#if 0
// If the input is an instance of HTTPInputSource, use the MIME type from the server
// This code is disabled because most HTTP servers don't send the correct MIME types
HTTPInputSource *httpInputSource = dynamic_cast<HTTPInputSource *>(inputSource);
bool releaseMIMEType = false;
if(!mimeType && httpInputSource && httpInputSource->IsOpen()) {
mimeType = httpInputSource->CopyContentMIMEType();
if(mimeType)
releaseMIMEType = true;
}
#endif
// The MIME type takes precedence over the file extension
if(mimeType) {
#if BUILD_FOR_MAC_OSX
if(FLACDecoder::HandlesMIMEType(mimeType)) {
decoder = new FLACDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && WavPackDecoder::HandlesMIMEType(mimeType)) {
decoder = new WavPackDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && MPEGDecoder::HandlesMIMEType(mimeType)) {
decoder = new MPEGDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && OggVorbisDecoder::HandlesMIMEType(mimeType)) {
decoder = new OggVorbisDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && MusepackDecoder::HandlesMIMEType(mimeType)) {
decoder = new MusepackDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && MonkeysAudioDecoder::HandlesMIMEType(mimeType)) {
decoder = new MonkeysAudioDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && OggSpeexDecoder::HandlesMIMEType(mimeType)) {
decoder = new OggSpeexDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && MODDecoder::HandlesMIMEType(mimeType)) {
decoder = new MODDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
if(NULL == decoder && LibsndfileDecoder::HandlesMIMEType(mimeType)) {
decoder = new LibsndfileDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
}
#endif
if(NULL == decoder && CoreAudioDecoder::HandlesMIMEType(mimeType)) {
decoder = new CoreAudioDecoder(inputSource);
if(AutomaticallyOpenDecoders() && !decoder->Open(error)) {
decoder->mInputSource = NULL;
delete decoder, decoder = NULL;
}
//.........这里部分代码省略.........
示例14: _inputStream
StreamTranscoder::StreamTranscoder(
IInputStream& inputStream,
IOutputFile& outputFile,
const ProfileLoader::Profile& profile,
const int subStreamIndex,
const double offset
)
: _inputStream( &inputStream )
, _outputStream( NULL )
, _sourceBuffer( NULL )
, _frameBuffer( NULL )
, _inputDecoder( NULL )
, _generator( NULL )
, _currentDecoder( NULL )
, _outputEncoder( NULL )
, _transform( NULL )
, _subStreamIndex( subStreamIndex )
, _offset( offset )
, _canSwitchToGenerator( false )
{
// create a transcode case
switch( _inputStream->getStreamType() )
{
case AVMEDIA_TYPE_VIDEO :
{
// input decoder
VideoDecoder* inputVideo = new VideoDecoder( *static_cast<InputStream*>( _inputStream ) );
// set decoder options with empty profile to set some key options to specific values (example: threads to auto)
inputVideo->setProfile( ProfileLoader::Profile() );
inputVideo->setup();
_inputDecoder = inputVideo;
_currentDecoder = _inputDecoder;
// output encoder
VideoEncoder* outputVideo = new VideoEncoder( profile.at( constants::avProfileCodec ) );
_outputEncoder = outputVideo;
VideoFrameDesc outputFrameDesc = _inputStream->getVideoCodec().getVideoFrameDesc();
outputFrameDesc.setParameters( profile );
outputVideo->setProfile( profile, outputFrameDesc );
// output stream
_outputStream = &outputFile.addVideoStream( outputVideo->getVideoCodec() );
// buffers to process
_sourceBuffer = new VideoFrame( _inputStream->getVideoCodec().getVideoFrameDesc() );
_frameBuffer = new VideoFrame( outputVideo->getVideoCodec().getVideoFrameDesc() );
// transform
_transform = new VideoTransform();
// generator decoder
VideoGenerator* generatorVideo = new VideoGenerator();
generatorVideo->setVideoFrameDesc( outputVideo->getVideoCodec().getVideoFrameDesc() );
_generator = generatorVideo;
break;
}
case AVMEDIA_TYPE_AUDIO :
{
// input decoder
AudioDecoder* inputAudio = new AudioDecoder( *static_cast<InputStream*>( _inputStream ) );
// set decoder options with empty profile to set some key options to specific values (example: threads to auto)
inputAudio->setProfile( ProfileLoader::Profile() );
inputAudio->setup();
_inputDecoder = inputAudio;
_currentDecoder = _inputDecoder;
// output encoder
AudioEncoder* outputAudio = new AudioEncoder( profile.at( constants::avProfileCodec ) );
_outputEncoder = outputAudio;
AudioFrameDesc outputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() );
outputFrameDesc.setParameters( profile );
if( subStreamIndex > -1 )
{
// @todo manage downmix ?
outputFrameDesc.setChannels( 1 );
}
outputAudio->setProfile( profile, outputFrameDesc );
// output stream
_outputStream = &outputFile.addAudioStream( outputAudio->getAudioCodec() );
// buffers to process
AudioFrameDesc inputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() );
if( subStreamIndex > -1 )
inputFrameDesc.setChannels( 1 );
_sourceBuffer = new AudioFrame( inputFrameDesc );
_frameBuffer = new AudioFrame( outputAudio->getAudioCodec().getAudioFrameDesc() );
// transform
_transform = new AudioTransform();
// generator decoder
AudioGenerator* generatorAudio = new AudioGenerator();
generatorAudio->setAudioFrameDesc( outputAudio->getAudioCodec().getAudioFrameDesc() );
_generator = generatorAudio;
//.........这里部分代码省略.........
示例15: BREAK_IF
void AudioPlayer::rotateBufferThread(int offsetFrame)
{
char* tmpBuffer = nullptr;
AudioDecoder* decoder = AudioDecoderManager::createDecoder(_audioCache->_fileFullPath.c_str());
do
{
BREAK_IF(decoder == nullptr || !decoder->open(_audioCache->_fileFullPath.c_str()));
uint32_t framesRead = 0;
const uint32_t framesToRead = _audioCache->_queBufferFrames;
const uint32_t bufferSize = framesToRead * decoder->getBytesPerFrame();
tmpBuffer = (char*)malloc(bufferSize);
memset(tmpBuffer, 0, bufferSize);
if (offsetFrame != 0) {
decoder->seek(offsetFrame);
}
ALint sourceState;
ALint bufferProcessed = 0;
bool needToExitThread = false;
while (!_isDestroyed) {
alGetSourcei(_alSource, AL_SOURCE_STATE, &sourceState);
if (sourceState == AL_PLAYING) {
alGetSourcei(_alSource, AL_BUFFERS_PROCESSED, &bufferProcessed);
while (bufferProcessed > 0) {
bufferProcessed--;
if (_timeDirty) {
_timeDirty = false;
offsetFrame = _currTime * decoder->getSampleRate();
decoder->seek(offsetFrame);
}
else {
_currTime += QUEUEBUFFER_TIME_STEP;
if (_currTime > _audioCache->_duration) {
if (_loop) {
_currTime = 0.0f;
} else {
_currTime = _audioCache->_duration;
}
}
}
framesRead = decoder->readFixedFrames(framesToRead, tmpBuffer);
if (framesRead == 0) {
if (_loop) {
decoder->seek(0);
framesRead = decoder->readFixedFrames(framesToRead, tmpBuffer);
} else {
needToExitThread = true;
break;
}
}
ALuint bid;
alSourceUnqueueBuffers(_alSource, 1, &bid);
alBufferData(bid, _audioCache->_format, tmpBuffer, framesRead * decoder->getBytesPerFrame(), decoder->getSampleRate());
alSourceQueueBuffers(_alSource, 1, &bid);
}
}
std::unique_lock<std::mutex> lk(_sleepMutex);
if (_isDestroyed || needToExitThread) {
break;
}
_sleepCondition.wait_for(lk,std::chrono::milliseconds(75));
}
} while(false);
ALOGV("Exit rotate buffer thread ...");
if (decoder != nullptr)
{
decoder->close();
}
AudioDecoderManager::destroyDecoder(decoder);
free(tmpBuffer);
_isRotateThreadExited = true;
ALOGV("%s exited.\n", __FUNCTION__);
}