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 <gnuradio/blocks/wavfile_sink.h> 27 28 namespace gr { 29 namespace blocks { 30 31 class wavfile_sink_impl : public wavfile_sink 32 { 33 private: 34 unsigned d_sample_rate; 35 int d_nchans; 36 unsigned d_sample_count; 37 int d_bytes_per_sample; 38 int d_bytes_per_sample_new; 39 int d_max_sample_val; 40 int d_min_sample_val; 41 int d_normalize_shift; 42 int d_normalize_fac; 43 44 FILE* d_fp; 45 FILE* d_new_fp; 46 bool d_updated; 47 boost::mutex d_mutex; 48 49 /*! 50 * \brief Convert a sample value within [-1;+1] to a corresponding 51 * short integer value 52 */ 53 short convert_to_short(float sample); 54 55 /*! 56 * \brief If any file changes have occurred, update now. This is called 57 * internally by work() and thus doesn't usually need to be called by 58 * hand. 59 */ 60 void do_update(); 61 62 /*! 63 * \brief Writes information to the WAV header which is not available 64 * a-priori (chunk size etc.) and closes the file. Not thread-safe and 65 * assumes d_fp is a valid file pointer, should thus only be called by 66 * other methods. 67 */ 68 void close_wav(); 69 70 protected: 71 bool stop(); 72 73 public: 74 wavfile_sink_impl(const char* filename, 75 int n_channels, 76 unsigned int sample_rate, 77 int bits_per_sample); 78 ~wavfile_sink_impl(); 79 80 bool open(const char* filename); 81 void close(); 82 83 void set_sample_rate(unsigned int sample_rate); 84 void set_bits_per_sample(int bits_per_sample); 85 86 int bits_per_sample(); 87 unsigned int sample_rate(); 88 89 int work(int noutput_items, 90 gr_vector_const_void_star& input_items, 91 gr_vector_void_star& output_items); 92 }; 93 94 } /* namespace blocks */ 95 } /* namespace gr */ 96 97 #endif /* INCLUDED_GR_WAVFILE_SINK_IMPL_H */ 98