Skip to content

Commit

Permalink
Add AudioConvert class
Browse files Browse the repository at this point in the history
This class allows to convert samples from one format to another. Works with all format types, and all memory alignment.
Move float conversion routines from AudioOutputUtils code.

Backward compatibility with AudioOutputUtils is preserved
  • Loading branch information
jyavenard committed Jun 10, 2013
1 parent 88a166c commit 01a486f
Show file tree
Hide file tree
Showing 12 changed files with 1,306 additions and 571 deletions.
835 changes: 835 additions & 0 deletions mythtv/libs/libmyth/audio/audioconvert.cpp

Large diffs are not rendered by default.

72 changes: 72 additions & 0 deletions mythtv/libs/libmyth/audio/audioconvert.h
@@ -0,0 +1,72 @@

/*
* Class AudioConvert
* Created by Jean-Yves Avenard on 10/06/13.
*
* Copyright (C) Bubblestuff Pty Ltd 2013
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/


#ifndef __MythXCode__audioconvert__
#define __MythXCode__audioconvert__

#include "mythexp.h"
#include "audiooutputsettings.h"

class AudioConvertInternal;

class MPUBLIC AudioConvert
{
public:

AudioConvert(AudioFormat in, AudioFormat out);
virtual ~AudioConvert();
/**
* Process
* Parameters:
* out : destination buffer where converted samples will be copied
* in : source buffer
* bytes: size in bytes of source buffer
*
* Return Value: size in bytes of samples converted or <= 0 if error
*/
int Process(void* out, const void* in, int bytes);

bool operator==(AudioConvert& rhs) const
{ return m_in == rhs.m_in && m_out == rhs.m_out; }
bool operator!=(AudioConvert& rhs) const
{ return m_in != m_out; }

// static utilities
static int toFloat(AudioFormat format, void* out, const void* in, int bytes);
static int fromFloat(AudioFormat format, void* out, const void* in, int bytes);
static void MonoToStereo(void* dst, const void* src, int samples);
static void DeinterleaveSamples(AudioFormat format, int channels,
uint8_t* output, const uint8_t* input,
int data_size);
static void InterleaveSamples(AudioFormat format, int channels,
uint8_t* output, const uint8_t* const* input,
int data_size);
static void InterleaveSamples(AudioFormat format, int channels,
uint8_t* output, const uint8_t* input,
int data_size);
private:
AudioConvertInternal* m_ctx;
AudioFormat m_in, m_out;
};

#endif /* defined(__MythXCode__audioconvert__) */
22 changes: 22 additions & 0 deletions mythtv/libs/libmyth/audio/audiooutputsettings.cpp
Expand Up @@ -202,6 +202,9 @@ int AudioOutputSettings::SampleSize(AudioFormat format)
}
}

/**
* Return AVSampleFormat closest equivalent to AudioFormat
*/
AudioFormat AudioOutputSettings::AVSampleFormatToFormat(AVSampleFormat format, int bits)
{
switch (av_get_packed_sample_fmt(format))
Expand All @@ -222,6 +225,25 @@ AudioFormat AudioOutputSettings::AVSampleFormatToFormat(AVSampleFormat format, i
}
}

/**
* Return AudioFormat closest equivalent to AVSampleFormat
* Note that FORMAT_S24LSB and FORMAT_S24 have no direct equivalent
* use S32 instead
*/
AVSampleFormat AudioOutputSettings::FormatToAVSampleFormat(AudioFormat format)
{
switch (format)
{
case FORMAT_U8: return AV_SAMPLE_FMT_U8;
case FORMAT_S16: return AV_SAMPLE_FMT_S16;
case FORMAT_FLT: return AV_SAMPLE_FMT_FLT;
case FORMAT_S32:
case FORMAT_S24:
case FORMAT_S24LSB: return AV_SAMPLE_FMT_S32;
default: return AV_SAMPLE_FMT_NONE;
}
}

void AudioOutputSettings::AddSupportedChannels(int channels)
{
m_channels.push_back(channels);
Expand Down
1 change: 1 addition & 0 deletions mythtv/libs/libmyth/audio/audiooutputsettings.h
Expand Up @@ -72,6 +72,7 @@ class MPUBLIC AudioOutputSettings
static const char* FormatToString(AudioFormat format);
static int SampleSize(AudioFormat format);
static AudioFormat AVSampleFormatToFormat(AVSampleFormat format, int bits = 0);
static AVSampleFormat FormatToAVSampleFormat(AudioFormat format);
void AddSupportedChannels(int channels);
bool IsSupportedChannels(int channels);
int BestSupportedChannels();
Expand Down

0 comments on commit 01a486f

Please sign in to comment.