r4018: Auto commit for Debian build
[wdq2wav.git] / wdq2wav.cpp
index 0607f123e46d6fa0621065261bd82722dc4029b6..392a108d71835413badb9c84afa4f56a66cd6133 100644 (file)
@@ -8,7 +8,7 @@
 **
 **  Copyright (c) 2003 Kevin Rosenberg
 **
-**  $Id: wdq2wav.cpp,v 1.12 2003/01/21 12:59:56 kevin Exp $
+**  $Id: wdq2wav.cpp,v 1.15 2003/02/12 06:10:19 kevin Exp $
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
 
 #include <wdq2wav.h>
 
-const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.12 2003/01/21 12:59:56 kevin Exp $";
+const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.15 2003/02/12 06:10:19 kevin Exp $";
 
 bool g_quiet = false;
 bool g_verbose = false;
 bool g_debug = false;
 
+// Define as NULL for non-Windows platforms
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+
 void
 error_msg (const char *msg)
 {
@@ -306,7 +312,7 @@ WindaqFile::ReadHeader ()
   unsigned short int tmp2;
 
   m_valid = false;
-  if ((m_fd = open (m_strFile.c_str(), O_RDONLY)) < 0) {
+  if ((m_fd = open (m_strFile.c_str(), O_RDONLY | O_BINARY)) < 0) {
     m_error = "Unable to open file";
     return false;
   }
@@ -607,7 +613,7 @@ WavFile::WriteFile ()
     return false;
 
   if (m_fd == 0)
-    if ((m_fd = open (m_strFile.c_str(), O_WRONLY | O_TRUNC | O_CREAT, 
+    if ((m_fd = open (m_strFile.c_str(), O_WRONLY | O_BINARY | O_TRUNC | O_CREAT, 
                      S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == 0) {
       std::ostringstream os;
       os << "Error opening output file " << m_strFile.c_str();
@@ -640,11 +646,11 @@ bool
 WavFile::Play ()
 {
 #ifdef WIN32
-  if (PlaySound ((LPCSTR) m_data, 0, SND_MEMORY | SND_NO_DEFAULT))
+  if (PlaySound ((LPCSTR) m_data, 0, SND_MEMORY | SND_NODEFAULT))
     return true;
 #elif defined(LINUX)
   int fd;
-  if ((fd = open ("/dev/dsp",O_WRONLY)) < 0) {
+  if ((fd = open ("/dev/dsp",O_WRONLY)) == -1) {
     error_msg ("Error opening /dev/dsp");
     return false;
   }
@@ -652,35 +658,43 @@ WavFile::Play ()
   int format = AFMT_S16_LE;
   if (ioctl (fd, SNDCTL_DSP_SETFMT, &format) == -1) {
     error_msg ("Error setting DSP format");
-    close(fd); return false; }
+    close(fd); return false;
+  }
   if (format != AFMT_S16_LE) {
     error_msg ("DSP Format not set");
-    close(fd); return false; }
+    close(fd); return false;
+  }
   
   int channels = m_nChannels;
   if (ioctl (fd, SNDCTL_DSP_CHANNELS, &format) == -1) {
     error_msg ("Error setting number of channels");
-    close(fd); return false; }
+    close(fd); return false;
+  }
   if (channels != m_nChannels) {
     error_msg ("Number of channels not set");
-    close(fd); return false; }
+    close(fd); return false;
+  }
 
   int speed = static_cast<int>(m_rate + 0.5);
   if (ioctl (fd, SNDCTL_DSP_SPEED, &speed) == -1) {
     error_msg ("Error setting sample rate");
-    close(fd); return false; }
-  double set_speed = speed;
-  if (fabs (set_speed - m_rate) / m_rate > 0.1) {
-    error_msg ("Sample rate not set");
-    close(fd); return false; }
+    close(fd); return false;
+  }
+  if (speed != m_rate && ! g_quiet) {
+    std::ostringstream os;
+    os << "Warning: Sample rate set to " << speed << ", not " << m_rate;
+    error_msg (os.str().c_str());
+  }
     
   if (write (fd, reinterpret_cast<char*>(m_data) + m_nHeaderBytes, m_nDataBytes) !=
       m_nDataBytes) {
     error_msg ("Error writing audio samples");
-    close(fd); return false; }
+    close(fd); return false;
+  }
 
   close (fd);
   return true;
+#else
 #endif
   
   return false;