GNU Radio 3.6.5.1 C++ API
wavfile_sink_impl.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2008,2009,2013 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  *
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING. If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef INCLUDED_GR_WAVFILE_SINK_IMPL_H
24 #define INCLUDED_GR_WAVFILE_SINK_IMPL_H
25 
26 #include <blocks/wavfile_sink.h>
27 #include <gr_file_sink_base.h>
28 
29 namespace gr {
30  namespace blocks {
31 
33  {
34  private:
35  unsigned d_sample_rate;
36  int d_nchans;
37  unsigned d_sample_count;
38  int d_bytes_per_sample;
39  int d_bytes_per_sample_new;
40  int d_max_sample_val;
41  int d_min_sample_val;
42  int d_normalize_shift;
43  int d_normalize_fac;
44 
45  FILE *d_fp;
46  FILE *d_new_fp;
47  bool d_updated;
48  boost::mutex d_mutex;
49 
50  /*!
51  * \brief Convert a sample value within [-1;+1] to a corresponding
52  * short integer value
53  */
54  short convert_to_short(float sample);
55 
56  /*!
57  * \brief If any file changes have occurred, update now. This is called
58  * internally by work() and thus doesn't usually need to be called by
59  * hand.
60  */
61  void do_update();
62 
63  /*!
64  * \brief Writes information to the WAV header which is not available
65  * a-priori (chunk size etc.) and closes the file. Not thread-safe and
66  * assumes d_fp is a valid file pointer, should thus only be called by
67  * other methods.
68  */
69  void close_wav();
70 
71  public:
72  wavfile_sink_impl(const char *filename,
73  int n_channels,
74  unsigned int sample_rate,
75  int bits_per_sample);
77 
78  bool open(const char* filename);
79  void close();
80 
81  void set_sample_rate(unsigned int sample_rate);
82  void set_bits_per_sample(int bits_per_sample);
83 
84  int bits_per_sample();
85  unsigned int sample_rate();
86 
87  int work(int noutput_items,
88  gr_vector_const_void_star &input_items,
89  gr_vector_void_star &output_items);
90  };
91 
92  } /* namespace blocks */
93 } /* namespace gr */
94 
95 #endif /* INCLUDED_GR_WAVFILE_SINK_IMPL_H */