Add Debian source format file
[wdq2wav.git] / wdq2wav.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **   Name:          wdq2wav.h
5 **   Purpose:       Header file for wdq2wav.cpp
6 **   Programmer:    Kevin Rosenberg <kevin@rosenberg.net>
7 **   Date Started:  Jan 2003
8 **
9 **  Copyright (c) 2003 Kevin Rosenberg
10 **
11 **  $Id$
12 **
13 **  This program is free software; you can redistribute it and/or modify
14 **  it under the terms of the GNU General Public License (version 2) as
15 **  published by the Free Software Foundation.
16 **
17 **  This program is distributed in the hope that it will be useful,
18 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
19 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 **  GNU General Public License for more details.
21 **
22 **  You should have received a copy of the GNU General Public License
23 **  along with this program; if not, write to the Free Software
24 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25 ******************************************************************************/
26
27 #include <stdio.h>
28 #include <iostream>
29 #include <cstdio>
30 #include <cstring>
31 #include <string>
32 #include <sstream>
33 #include <ctime>
34 #include <fcntl.h>
35 #include <math.h>
36 #include <sys/types.h>
37 #include <sys/stat.h>
38 #ifdef _WIN32
39 #include <io.h>
40 #include <getopt.h>
41 #else
42 #include <unistd.h>
43 #endif
44
45 #ifdef __linux__
46 #include <endian.h>
47 #if __BYTE_ORDER == __BIG_ENDIAN
48 #define WORDS_BIG_ENDIAN 1
49 #endif
50 #endif
51
52 extern const char* g_szIdStr;
53 extern bool g_quiet;
54 extern bool g_verbose;
55 extern bool g_debug;
56
57 #define MAX_INPUT_STR 256
58
59 void error_msg (const char *msg);
60 void info_msg (const char *msg);
61 void info_msg_sans_newline (const char *msg);
62
63 bool wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool play);
64
65 class WindaqFile
66 {
67 public:
68   WindaqFile (const char* fname);
69   ~WindaqFile ();
70   bool ReadHeader();
71
72   bool m_valid;
73   std::string m_error;
74   int m_fd;
75   bool m_bLegacy_format;
76   bool m_bHires;
77   int m_nMaxChannels;
78   int m_nChannels;
79   unsigned long int m_nSamples;
80   double m_sample_rate;
81   std::string m_strFile;
82   unsigned int m_sr_denom, m_sr_numer;
83   unsigned short int m_nHeader_bytes, m_channel_offset, m_nBytes_channel_header;
84   unsigned int m_nData_bytes;
85   unsigned int m_time_acq_start;
86   unsigned int m_time_acq_stop;
87   double m_time_between_channel_samples;
88
89   bool any_packed_channels();
90   bool is_channel_packed(int iChannel);
91 };
92
93 class WindaqChannel
94 {
95 public:
96   WindaqFile& r_wdq;
97   signed short int *m_data;
98   double m_slope;
99   double m_intercept;
100   unsigned int m_channel;
101   bool m_valid;
102   std::string m_units;
103   signed short int m_min_raw_data;
104   signed short int m_max_raw_data;
105   double m_max_scaled_data;
106   double m_min_scaled_data;
107   double m_raw_mean;
108
109   WindaqChannel (WindaqFile& wdq, const int channel);
110   ~WindaqChannel ();
111   double raw2measured(signed short int raw) const { return (raw * m_slope) + m_intercept; }
112
113  private:
114   bool read_channel_data();
115 };
116
117
118 class WavFile
119 {
120  public:
121   bool m_valid;
122   signed short int* m_data;
123   unsigned long int m_nSamples;
124   std::string m_strFile;
125   int m_fd;
126   double m_rate;
127   unsigned int m_nChannels;
128   unsigned int m_nBitsPerSample;
129   unsigned int m_nBytesPerSample;
130   unsigned long int m_nHeaderBytes;
131   long int m_nDataBytes;
132   long int m_nFileBytes;
133
134   WavFile (WindaqChannel& wdq_channel, const char* fname);
135   ~WavFile ();
136
137   bool WriteFile ();
138
139   bool Play();
140
141  private:
142   bool fill_header();
143 };
144
145 template<class T>
146 inline T nearest (double x)
147 {
148   return (x > 0 ?
149           static_cast<T>(x+0.5) : static_cast<T>(x-0.5));
150 }