Use iostreams instead of file descriptors for dumping.
[asdcplib.git] / src / AS_DCP_PCM.cpp
index e5260e47646384a9f0007c46c12154c96c4eb581..a50f24b6967c87a28ab43e53591e2851b0faae77 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2006, John Hurst
+Copyright (c) 2004-2008, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -31,6 +31,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "AS_DCP_internal.h"
 #include <map>
+#include <iostream>
+#include <iomanip>
 
 //------------------------------------------------------------------------------------------
 
@@ -67,10 +69,29 @@ MD_to_PCM_ADesc(MXF::WaveAudioDescriptor* ADescObj, PCM::AudioDescriptor& ADesc)
   ADesc.BlockAlign = ADescObj->BlockAlign;
   ADesc.AvgBps = ADescObj->AvgBps;
   ADesc.LinkedTrackID = ADescObj->LinkedTrackID;
-  ADesc.ContainerDuration = ADescObj->ContainerDuration;
+  assert(ADescObj->ContainerDuration <= 0xFFFFFFFFL);
+  ADesc.ContainerDuration = (ui32_t) ADescObj->ContainerDuration;
   return RESULT_OK;
 }
 
+//
+std::ostream&
+ASDCP::PCM::operator << (std::ostream& strm, const AudioDescriptor& ADesc)
+{
+  strm << "        SampleRate: " << ADesc.SampleRate.Numerator << "/" << ADesc.SampleRate.Denominator << std::endl;
+  strm << " AudioSamplingRate: " << ADesc.AudioSamplingRate.Numerator << "/" << ADesc.AudioSamplingRate.Denominator << std::endl;
+  strm << "            Locked: " << (unsigned) ADesc.Locked << std::endl;
+  strm << "      ChannelCount: " << (unsigned) ADesc.ChannelCount << std::endl;
+  strm << "  QuantizationBits: " << (unsigned) ADesc.QuantizationBits << std::endl;
+  strm << "        BlockAlign: " << (unsigned) ADesc.BlockAlign << std::endl;
+  strm << "            AvgBps: " << (unsigned) ADesc.AvgBps << std::endl;
+  strm << "     LinkedTrackID: " << (unsigned) ADesc.LinkedTrackID << std::endl;
+  strm << " ContainerDuration: " << (unsigned) ADesc.ContainerDuration << std::endl;
+
+  return strm;
+}
+
+//
 void
 ASDCP::PCM::AudioDescriptorDump(const AudioDescriptor& ADesc, FILE* stream)
 {
@@ -160,7 +181,8 @@ ASDCP::PCM::MXFReader::h__Reader::OpenRead(const char* filename)
     }
 
   // check for sample/frame rate sanity
-  if ( m_ADesc.SampleRate != EditRate_24
+  if ( ASDCP_SUCCESS(result)
+       && m_ADesc.SampleRate != EditRate_24
        && m_ADesc.SampleRate != EditRate_48
        && m_ADesc.SampleRate != EditRate_23_98 )
     {
@@ -202,7 +224,7 @@ ASDCP::PCM::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& FrameB
   if ( ! m_File.IsOpen() )
     return RESULT_INIT;
 
-  return ReadEKLVPacket(FrameNum, FrameBuf, Dict::ul(MDD_WAVEssence), Ctx, HMAC);
+  return ReadEKLVFrame(FrameNum, FrameBuf, Dict::ul(MDD_WAVEssence), Ctx, HMAC);
 }
 
 //------------------------------------------------------------------------------------------
@@ -215,7 +237,7 @@ ASDCP::PCM::FrameBuffer::Dump(FILE* stream, ui32_t dump_len) const
   if ( stream == 0 )
     stream = stderr;
 
-  fprintf(stream, "Frame: %06lu, %7lu bytes\n",
+  fprintf(stream, "Frame: %06u, %7u bytes\n",
          m_FrameNumber, m_Size);
 
   if ( dump_len )
@@ -368,9 +390,9 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
       return RESULT_RAW_FORMAT;
     }
 
-  if ( ADesc.AudioSamplingRate != SampleRate_48k )
+  if ( ADesc.AudioSamplingRate != SampleRate_48k && ADesc.AudioSamplingRate != SampleRate_96k )
     {
-      DefaultLogSink().Error("AudioDescriptor.AudioSamplingRate is not 48000/1: %d/%d\n",
+      DefaultLogSink().Error("AudioDescriptor.AudioSamplingRate is not 48000/1 or 96000/1: %d/%d\n",
                             ADesc.AudioSamplingRate.Numerator, ADesc.AudioSamplingRate.Denominator);
       return RESULT_RAW_FORMAT;
     }
@@ -449,14 +471,12 @@ ASDCP::PCM::MXFWriter::OpenWrite(const char* filename, const WriterInfo& Info,
                                 const AudioDescriptor& ADesc, ui32_t HeaderSize)
 {
   m_Writer = new h__Writer;
+  m_Writer->m_Info = Info;
   
   Result_t result = m_Writer->OpenWrite(filename, HeaderSize);
 
   if ( ASDCP_SUCCESS(result) )
-    {
-      m_Writer->m_Info = Info;
-      result = m_Writer->SetSourceStream(ADesc);
-    }
+    result = m_Writer->SetSourceStream(ADesc);
 
   if ( ASDCP_FAILURE(result) )
     m_Writer.release();