adding in some sanity checks

adpcm
Dimitri Diakopoulos 11 years ago
parent dad96afdcb
commit 2932ff1dd2

@ -97,7 +97,7 @@ int main()
myDevice.Play(fileData->samples);
}
// Test wav file encoder
// Test wav file encoder
encoder.WriteFile({2, 44100, 32, PCM_FLT}, fileData->samples, "encoded.wav");
return 0;

@ -27,17 +27,27 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define WAVE_ENCODER_H
#include "Common.h"
#include "WavDecoder.h" // For reference structs
#include "WavDecoder.h"
#include "RiffUtils.h"
namespace nqr
{
// A simplistic encoder that takes a blob of data, conforms it to the user's
// EncoderParams preference, and writes to disk. Be warned, does not support resampling!
// @todo support dithering, samplerate conversion, etc.
class WavEncoder
{
enum EncoderError
{
NoError,
InsufficientSampleData,
FileIOError,
UnsupportedSamplerate,
UnsupportedChannelConfiguration,
BufferTooBig,
};
public:
@ -45,7 +55,7 @@ public:
~WavEncoder();
// Assume data adheres to EncoderParams, except for bit depth and fmt
void WriteFile(const EncoderParams p, const std::vector<float> & data, const std::string & path);
int WriteFile(const EncoderParams p, const AudioData * d, const std::string & path);
};

@ -28,7 +28,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace nqr;
// Big-endian convert
inline void toBytes(int value, char * arr)
{
arr[0] = (value) & 0xFF;
@ -47,10 +46,28 @@ WavEncoder::~WavEncoder()
}
//@todo check for max file length, sanity checks, etc.
void WavEncoder::WriteFile(const EncoderParams p, const std::vector<float> & data, const std::string & path)
int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std::string & path)
{
if (d->samples.size() <= 32)
{
return EncoderError::InsufficientSampleData;
}
if (d->channelCount < 1 || d->channelCount > 8)
{
return EncoderError::UnsupportedChannelConfiguration;
}
auto maxFileSizeInBytes = std::numeric_limits<uint32_t>::max();
auto samplesSizeInBytes = d->samples.size() * sizeof(float);
// 64 arbitrary
if ((samplesSizeInBytes - 64) >= maxFileSizeInBytes)
{
return EncoderError::BufferTooBig;
}
std::ofstream fout(path.c_str(), std::ios::out | std::ios::binary);
if (!fout.is_open())

Loading…
Cancel
Save