/*
-Copyright (c) 2005-2006, John Hurst
+Copyright (c) 2005-2009, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
*/
#include "Wav.h"
-#include "hex_utils.h"
#include <assert.h>
+#include <KM_log.h>
+using Kumu::DefaultLogSink;
const ui32_t SimpleWavHeaderLength = 46;
nchannels = ADesc.ChannelCount;
bitspersample = ADesc.QuantizationBits;
samplespersec = (ui32_t)ceil(ADesc.AudioSamplingRate.Quotient());
- avgbps = samplespersec * nchannels * ((bitspersample + 7) / 8);
- blockalign = nchannels * ((bitspersample + 7) / 8);
+ blockalign = nchannels * (bitspersample / 8);
+ avgbps = samplespersec * blockalign;
cbsize = 0;
data_len = ASDCP::PCM::CalcFrameBufferSize(ADesc) * ADesc.ContainerDuration;
}
ADesc.QuantizationBits = bitspersample;
ui32_t FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(ADesc);
ADesc.ContainerDuration = data_len / FrameBufferSize;
+ ADesc.ChannelFormat = PCM::CF_NONE;
}
//
ASDCP::Result_t
-ASDCP::Wav::SimpleWaveHeader::WriteToFile(ASDCP::FileWriter& OutFile) const
+ASDCP::Wav::SimpleWaveHeader::WriteToFile(Kumu::FileWriter& OutFile) const
{
ui32_t write_count;
byte_t tmp_header[SimpleWavHeaderLength];
ui32_t RIFF_len = data_len + SimpleWavHeaderLength - 8;
memcpy(p, &FCC_RIFF, sizeof(fourcc)); p += 4;
- *((ui32_t*)p) = ASDCP_i32_LE(RIFF_len); p += 4;
+ *((ui32_t*)p) = KM_i32_LE(RIFF_len); p += 4;
memcpy(p, &FCC_WAVE, sizeof(fourcc)); p += 4;
memcpy(p, &FCC_fmt_, sizeof(fourcc)); p += 4;
- *((ui32_t*)p) = ASDCP_i32_LE(fmt_len); p += 4;
- *((ui16_t*)p) = ASDCP_i16_LE(format); p += 2;
- *((ui16_t*)p) = ASDCP_i16_LE(nchannels); p += 2;
- *((ui32_t*)p) = ASDCP_i32_LE(samplespersec); p += 4;
- *((ui32_t*)p) = ASDCP_i32_LE(avgbps); p += 4;
- *((ui16_t*)p) = ASDCP_i16_LE(blockalign); p += 2;
- *((ui16_t*)p) = ASDCP_i16_LE(bitspersample); p += 2;
- *((ui16_t*)p) = ASDCP_i16_LE(cbsize); p += 2;
+ *((ui32_t*)p) = KM_i32_LE(fmt_len); p += 4;
+ *((ui16_t*)p) = KM_i16_LE(format); p += 2;
+ *((ui16_t*)p) = KM_i16_LE(nchannels); p += 2;
+ *((ui32_t*)p) = KM_i32_LE(samplespersec); p += 4;
+ *((ui32_t*)p) = KM_i32_LE(avgbps); p += 4;
+ *((ui16_t*)p) = KM_i16_LE(blockalign); p += 2;
+ *((ui16_t*)p) = KM_i16_LE(bitspersample); p += 2;
+ *((ui16_t*)p) = KM_i16_LE(cbsize); p += 2;
memcpy(p, &FCC_data, sizeof(fourcc)); p += 4;
- *((ui32_t*)p) = ASDCP_i32_LE(data_len); p += 4;
+ *((ui32_t*)p) = KM_i32_LE(data_len); p += 4;
return OutFile.Write(tmp_header, SimpleWavHeaderLength, &write_count);
}
//
ASDCP::Result_t
-ASDCP::Wav::SimpleWaveHeader::ReadFromFile(const ASDCP::FileReader& InFile, ui32_t* data_start)
+ASDCP::Wav::SimpleWaveHeader::ReadFromFile(const Kumu::FileReader& InFile, ui32_t* data_start)
{
ui32_t read_count = 0;
ui32_t local_data_start = 0;
fourcc test_RIFF(p); p += 4;
if ( test_RIFF != FCC_RIFF )
{
- DefaultLogSink().Error("File does not begin with RIFF header\n");
+ // DefaultLogSink().Debug("File does not begin with RIFF header\n");
return RESULT_RAW_FORMAT;
}
- ui32_t RIFF_len = ASDCP_i32_LE(*(ui32_t*)p); p += 4;
+ ui32_t RIFF_len = KM_i32_LE(*(ui32_t*)p); p += 4;
fourcc test_WAVE(p); p += 4;
if ( test_WAVE != FCC_WAVE )
{
- DefaultLogSink().Error("File does not contain a WAVE header\n");
+ DefaultLogSink().Debug("File does not contain a WAVE header\n");
return RESULT_RAW_FORMAT;
}
while ( p < end_p )
{
test_fcc = fourcc(p); p += 4;
- ui32_t chunk_size = ASDCP_i32_LE(*(ui32_t*)p); p += 4;
+ ui32_t chunk_size = KM_i32_LE(*(ui32_t*)p); p += 4;
if ( test_fcc == FCC_data )
{
if ( chunk_size > RIFF_len )
{
- DefaultLogSink().Error("Chunk size %lu larger than file: %lu\n", chunk_size, RIFF_len);
+ DefaultLogSink().Error("Chunk size %u larger than file: %u\n", chunk_size, RIFF_len);
return RESULT_RAW_FORMAT;
}
if ( test_fcc == FCC_fmt_ )
{
- ui16_t format = ASDCP_i16_LE(*(ui16_t*)p); p += 2;
+ ui16_t format = KM_i16_LE(*(ui16_t*)p); p += 2;
- if ( format != 1 )
+ if ( format != WAVE_FORMAT_PCM && format != WAVE_FORMAT_EXTENSIBLE )
{
- DefaultLogSink().Error("Expecting uncompressed essence, got format type %hu\n", format);
+ DefaultLogSink().Error("Expecting uncompressed PCM data, got format type %hd\n", format);
return RESULT_RAW_FORMAT;
}
- nchannels = ASDCP_i16_LE(*(ui16_t*)p); p += 2;
- samplespersec = ASDCP_i32_LE(*(ui32_t*)p); p += 4;
- avgbps = ASDCP_i32_LE(*(ui32_t*)p); p += 4;
- blockalign = ASDCP_i16_LE(*(ui16_t*)p); p += 2;
- bitspersample = ASDCP_i16_LE(*(ui16_t*)p); p += 2;
- p += chunk_size - 16;
+ nchannels = KM_i16_LE(*(ui16_t*)p); p += 2;
+ samplespersec = KM_i32_LE(*(ui32_t*)p); p += 4;
+ avgbps = KM_i32_LE(*(ui32_t*)p); p += 4;
+ blockalign = KM_i16_LE(*(ui16_t*)p); p += 2;
+ bitspersample = KM_i16_LE(*(ui16_t*)p); p += 2;
+ p += chunk_size - 16; // 16 is the number of bytes read in this block
}
else
{
value <<= 1;
}
- *(ui32_t*)(buf+2) = ASDCP_i32_BE(value);
+ *(ui32_t*)(buf+2) = KM_i32_BE(value);
}
//
extended_to_Rat(const byte_t* buf)
{
ui32_t last = 0;
- ui32_t mantissa = ASDCP_i32_BE(*(ui32_t*)(buf+2));
+ ui32_t mantissa = KM_i32_BE(*(ui32_t*)(buf+2));
byte_t exp = 30 - *(buf+1);
ADesc.AudioSamplingRate = extended_to_Rat(sampleRate);
ADesc.QuantizationBits = sampleSize;
ADesc.BlockAlign = sampleSize / 8;
- ADesc.AvgBps = ADesc.BlockAlign * (ui32_t)ceil(ADesc.AudioSamplingRate.Quotient());
+ ADesc.AvgBps = (ui32_t) (ADesc.BlockAlign * ADesc.AudioSamplingRate.Quotient());
ui32_t FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(ADesc);
ADesc.ContainerDuration = data_len / FrameBufferSize;
+ ADesc.ChannelFormat = PCM::CF_NONE;
}
//
ASDCP::Result_t
-ASDCP::AIFF::SimpleAIFFHeader::ReadFromFile(const ASDCP::FileReader& InFile, ui32_t* data_start)
+ASDCP::AIFF::SimpleAIFFHeader::ReadFromFile(const Kumu::FileReader& InFile, ui32_t* data_start)
{
ui32_t read_count = 0;
ui32_t local_data_start = 0;
fourcc test_FORM(p); p += 4;
if ( test_FORM != FCC_FORM )
{
- DefaultLogSink().Error("File does not begin with FORM header\n");
+ // DefaultLogSink().Debug("File does not begin with FORM header\n");
return RESULT_RAW_FORMAT;
}
- ui32_t RIFF_len = ASDCP_i32_BE(*(ui32_t*)p); p += 4;
+ ui32_t RIFF_len = KM_i32_BE(*(ui32_t*)p); p += 4;
fourcc test_AIFF(p); p += 4;
if ( test_AIFF != FCC_AIFF )
{
- DefaultLogSink().Error("File does not contain an AIFF header\n");
+ DefaultLogSink().Debug("File does not contain an AIFF header\n");
return RESULT_RAW_FORMAT;
}
while ( p < end_p )
{
test_fcc = fourcc(p); p += 4;
- ui32_t chunk_size = ASDCP_i32_BE(*(ui32_t*)p); p += 4;
+ ui32_t chunk_size = KM_i32_BE(*(ui32_t*)p); p += 4;
if ( test_fcc == FCC_COMM )
{
- numChannels = ASDCP_i16_BE(*(ui16_t*)p); p += 2;
- numSampleFrames = ASDCP_i32_BE(*(ui32_t*)p); p += 4;
- sampleSize = ASDCP_i16_BE(*(ui16_t*)p); p += 2;
+ numChannels = KM_i16_BE(*(ui16_t*)p); p += 2;
+ numSampleFrames = KM_i32_BE(*(ui32_t*)p); p += 4;
+ sampleSize = KM_i16_BE(*(ui16_t*)p); p += 2;
memcpy(sampleRate, p, 10);
p += 10;
}
{
if ( chunk_size > RIFF_len )
{
- DefaultLogSink().Error("Chunk size %lu larger than file: %lu\n", chunk_size, RIFF_len);
+ DefaultLogSink().Error("Chunk size %u larger than file: %u\n", chunk_size, RIFF_len);
return RESULT_RAW_FORMAT;
}
- ui32_t offset = ASDCP_i32_BE(*(ui32_t*)p); p += 4;
+ ui32_t offset = KM_i32_BE(*(ui32_t*)p); p += 4;
p += 4; // blockSize;
data_len = chunk_size - 8;
*data_start = (p - buf) + offset;
- fprintf(stderr, "*data_start: %p\n", *data_start);
break;
}
else