From: bruceperens Date: Tue, 11 Mar 2014 07:03:11 +0000 (+0000) Subject: Turn on all warnings, and then fix whatever had warnings. G++ by default X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=1d9086df3d8b704831e5297677328d3708d740a9;p=freetel-svn-tracking.git Turn on all warnings, and then fix whatever had warnings. G++ by default doesn't complain about non-void functions that return no value. That was enough to prompt me to turn on all possible warnings. git-svn-id: https://svn.code.sf.net/p/freetel/code@1425 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/freedv-server/CMakeLists.txt b/freedv-server/CMakeLists.txt index a5d03cb1..97c6aeee 100644 --- a/freedv-server/CMakeLists.txt +++ b/freedv-server/CMakeLists.txt @@ -88,18 +88,28 @@ message(STATUS "${Param.build-type} ${Version.major}.${Version.minor}.${Version. # set(Compile.linux.sources + source/platform/linux/alsa.cpp + source/platform/linux/audio_out_alsa.cpp + source/platform/linux/audio_in_alsa.cpp source/platform/linux/scheduler.cpp + source/platform/linux/privilege.cpp +) +set(Compile.linux.libraries + asound ) # FIX: Add other platforms. if(Platform.name STREQUAL Linux) set(Compile.platform.sources ${Compile.linux.sources}) + set(Compile.platform.libraries ${Compile.linux.libraries}) endif(Platform.name STREQUAL Linux) set(Compile.sources ${Compile.platform.sources} source/audio_device.cpp + source/audio_in_default.cpp source/audio_input.cpp + source/audio_out_default.cpp source/audio_output.cpp source/audio_sink.cpp source/base.cpp @@ -109,6 +119,8 @@ set(Compile.sources source/driver_manager.cpp source/event_handler.cpp source/fifo.cpp + source/framer.cpp + source/framer_noop.cpp source/interfaces.cpp source/io_device.cpp source/keying.cpp @@ -178,4 +190,7 @@ else( Codec2.lib AND Codec2.include ) message(FATAL_ERROR "Can't find Codec2 library.") endif( Codec2.lib AND Codec2.include ) +target_link_libraries(freedv-server ${Compile.platform.libraries}) +target_link_libraries(freedv-gtest ${Compile.platform.libraries}) + install(TARGETS freedv-server RUNTIME DESTINATION bin) diff --git a/freedv-server/parameters/c-flags.txt b/freedv-server/parameters/c-flags.txt index 6438c8c9..4ee6b833 100644 --- a/freedv-server/parameters/c-flags.txt +++ b/freedv-server/parameters/c-flags.txt @@ -1 +1 @@ --g -pedantic +-g -pedantic -Wall -Wextra diff --git a/freedv-server/parameters/cxx-flags.txt b/freedv-server/parameters/cxx-flags.txt index 4208c7b0..0891ade7 100644 --- a/freedv-server/parameters/cxx-flags.txt +++ b/freedv-server/parameters/cxx-flags.txt @@ -1 +1 @@ --std=c++11 -g -pedantic -DDEBUG +-std=c++11 -g -pedantic -Wall -Wextra -DDEBUG diff --git a/freedv-server/source/audio_sink.cpp b/freedv-server/source/audio_sink.cpp index 6059605a..deaeb2c1 100644 --- a/freedv-server/source/audio_sink.cpp +++ b/freedv-server/source/audio_sink.cpp @@ -32,7 +32,7 @@ namespace FreeDV { // Write audio into the "short" type. std::size_t - AudioSink::write16(const std::int16_t * array, std::size_t length) + AudioSink::write16(const std::int16_t *, std::size_t length) { return length; } diff --git a/freedv-server/source/base.cpp b/freedv-server/source/base.cpp index 5bb9ab57..fdf3b06b 100644 --- a/freedv-server/source/base.cpp +++ b/freedv-server/source/base.cpp @@ -13,7 +13,7 @@ namespace FreeDV { delete parameters; } - bool const + bool Base::captive() const { return false; diff --git a/freedv-server/source/big_main.cpp b/freedv-server/source/big_main.cpp index c84a1cef..86657dd1 100644 --- a/freedv-server/source/big_main.cpp +++ b/freedv-server/source/big_main.cpp @@ -36,9 +36,9 @@ static void help(const char * name) " [options]\n" "\nWhere options are these flags:\n\n" "--codec or -c\t\tSelect the voice codec.\n" + "--config or -c\t\tPrint the configuration.\n" "--drivers or -d\t\tPrint a list of the available device drivers.\n" "--framer or -f\t\tSelect the communications protocol framer.\n" - "--gui or -g\t\tSelect the graphical user interface.\n" "--help or -h\t\tPrint this message.\n" "--interface or -i\tSelect the user-interface (graphical or otherwise).\n" "--keying or -k\t\tSelect the transmitter keying interface.\n" @@ -73,7 +73,6 @@ static const struct option options[] = { { "codec", required_argument, 0, 'c' }, { "config", no_argument, 0, 'C' }, { "drivers", no_argument, 0, 'd' }, - { "default", no_argument, 0, 'D' }, { "framer", required_argument, 0, 'f' }, { "help", no_argument, 0, 'h' }, { "interface", required_argument, 0, 'i' }, @@ -92,95 +91,92 @@ static const struct option options[] = { int main(int argc, char * * argv) { - int command; Interfaces i; - const char * driver; - const char * parameter; const DriverManager * const m = driver_manager(); i.fill_in(); if ( argc > 1 ) { - while ((command = getopt_long(argc, argv, "c:dhi:k:l:m:M:n:p:r:t:x:", options, NULL)) != -1) { - switch (command) { - case 'f': - case 'i': - case 'k': - case 'l': - case 'm': - case 'p': - case 'P': - case 'r': - case 't': - case 'x': - char * const colon(index(optarg, ':')); - - if ( colon == 0 || colon[0] != ':' || colon[1] == 0 ) { - cerr << argv[optind - 1] << ": Missing colon. Argument must be of the form \":\"" << endl; - exit(1); - } - - *colon = 0; - driver = optarg; - parameter = &colon[1]; - } - - Base * set = (Base *)1; + int command; + while ((command = getopt_long(argc, argv, "c:Cdf:hi:k:l:m:M:p:P:r:t:x:", options, NULL)) != -1 ) { switch (command) { case 'c': - set = i.codec = m->codec(driver, parameter); - break; - case 'd': - drivers(); - exit(0); - case 'D': - break; case 'f': - set = i.framer = m->framer(driver, parameter); - break; - default: - case 'h': - help(argv[0]); - exit(1); case 'i': - set = i.user_interface = m->user_interface(driver, parameter, &i); - break; case 'k': - set = i.keying_output = m->keying_output(driver, parameter); - break; case 'l': - set = i.loudspeaker = m->audio_output(driver, parameter); - break; case 'm': - set = i.microphone = m->audio_input(driver, parameter); - break; case 'M': - set = i.modem = m->modem(driver, parameter); - break; case 'p': - set = i.ptt_input_digital = m->ptt_input(driver, parameter); - break; case 'P': - set = i.ptt_input_ssb = m->ptt_input(driver, parameter); - break; case 'r': - set = i.receiver = m->audio_input(driver, parameter); - break; case 't': - set = i.transmitter = m->audio_output(driver, parameter); - break; case 'x': - set = i.text_input = m->text_input(driver, parameter); - break; - case 'C': - // FIX: Operator overload doesn't work here. - i.print(cout) << endl; - exit(0); - case 0: - break; + const char * const driver = optarg; + char * const colon = index(optarg, ':'); + const char * parameter = ""; + + if ( colon ) { + *colon = 0; + parameter = colon + 1; + } + + Base * set = (Base *)1; + + switch (command) { + case 'c': + set = i.codec = m->codec(driver, parameter); + break; + case 'd': + drivers(); + exit(0); + case 'f': + set = i.framer = m->framer(driver, parameter); + break; + default: + case 'h': + help(argv[0]); + exit(1); + case 'i': + set = i.user_interface = m->user_interface(driver, parameter, &i); + break; + case 'k': + set = i.keying_output = m->keying_output(driver, parameter); + break; + case 'l': + set = i.loudspeaker = m->audio_output(driver, parameter); + break; + case 'm': + set = i.microphone = m->audio_input(driver, parameter); + break; + case 'M': + set = i.modem = m->modem(driver, parameter); + break; + case 'p': + set = i.ptt_input_digital = m->ptt_input(driver, parameter); + break; + case 'P': + set = i.ptt_input_ssb = m->ptt_input(driver, parameter); + break; + case 'r': + set = i.receiver = m->audio_input(driver, parameter); + break; + case 't': + set = i.transmitter = m->audio_output(driver, parameter); + break; + case 'x': + set = i.text_input = m->text_input(driver, parameter); + break; + case 'C': + // FIX: Operator overload doesn't work here. + i.print(cout) << endl; + exit(0); + case 0: + break; + } + if ( set == 0 ) + exit(1); } - if ( set == 0 ) - exit(1); } } else { // argc <= 1 diff --git a/freedv-server/source/codec_noop.cpp b/freedv-server/source/codec_noop.cpp index f50db6d3..f7a39b51 100644 --- a/freedv-server/source/codec_noop.cpp +++ b/freedv-server/source/codec_noop.cpp @@ -16,7 +16,7 @@ namespace FreeDV { /// Data Bytes provided to decode16 and encode16 must be a multiple /// of this value. The result is invariant. /// \return The number of data bytes necessary to store a codec frame. - virtual std::size_t const + virtual std::size_t bytes_per_frame() const; /// Decode from data bytes to audio samples. @@ -46,7 +46,7 @@ namespace FreeDV { /// Return the duration of a frame in milliseconds. /// \return The duration of a frame in milliseconds. - virtual int const + virtual int frame_duration() const; /// Return the number of audio samples expected to create a codec @@ -55,7 +55,7 @@ namespace FreeDV { /// a given SampleRate. /// \return The number of audio samples expected to create a codec /// frame. - virtual std::size_t const + virtual std::size_t samples_per_frame() const; }; @@ -68,7 +68,7 @@ namespace FreeDV { { } - std::size_t const + std::size_t CodecNoOp::bytes_per_frame() const { return sizeof(std::int16_t); @@ -77,7 +77,7 @@ namespace FreeDV { std::size_t CodecNoOp::decode16(const std::uint8_t * i, std::int16_t * o, std::size_t * data_length, std::size_t sample_length) { - const std::size_t length = std::min(*data_length / 2, sample_length); + const std::size_t length = min(*data_length / 2, sample_length); memcpy(o, i, length * 2); *data_length = length * 2; return length; @@ -90,13 +90,13 @@ namespace FreeDV { return length; } - int const + int CodecNoOp::frame_duration() const { return 1; } - std::size_t const + std::size_t CodecNoOp::samples_per_frame() const { return 1; diff --git a/freedv-server/source/driver_manager.cpp b/freedv-server/source/driver_manager.cpp index 6dea58a1..7c82aa3e 100644 --- a/freedv-server/source/driver_manager.cpp +++ b/freedv-server/source/driver_manager.cpp @@ -29,12 +29,15 @@ namespace FreeDV { } static FreeDV::Base * - pick(const char * key, const char * type, const char * const parameters, const DriverList * list) + pick(const char * key, const char * type, const char * const parameters, const DriverList * list, Interfaces * interfaces = 0) { while ( list->key ) { if ( strcmp(key, list->key) == 0 ) { try { - return (*(list->creator))(parameters); + if ( interfaces ) + return (*(list->creator_i))(parameters, interfaces); + else + return (*(list->creator))(parameters); } catch(std::exception & e) { std::cerr << "Open " << type << " \"" << key << "\": " << e.what() << std::endl; @@ -158,7 +161,7 @@ namespace FreeDV { UserInterface * DriverManager::user_interface(const char * key, const char * parameter, Interfaces * interfaces) const { - return (UserInterface *)pick(key, "user interface", parameter, user_interface_drivers); + return (UserInterface *)pick(key, "user interface", parameter, user_interface_drivers, interfaces); } void @@ -216,7 +219,7 @@ namespace FreeDV { place(key, (base_creator)creator, enumerator, &user_interface_drivers); } - DriverManager * const + DriverManager * driver_manager() { static DriverManager * const d(new DriverManager()); diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index b9998175..4f1ca9ce 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -1,6 +1,7 @@ /// FreeDV driver interface definitions. #include #include +#include /// Namespace used for all code in this program. namespace FreeDV { @@ -31,8 +32,8 @@ namespace FreeDV { uint8_t * in; const uint8_t * out; - void out_overrun(std::size_t length) const; - uint8_t * reorder(std::size_t length); + void out_overrun() const; + uint8_t * reorder(std::size_t length); public: /// Create the FIFO object. @@ -44,7 +45,7 @@ namespace FreeDV { /// Returns the amount of space available for incoming data. /// \return The amount of space, in bytes, available for incoming data. inline std::size_t incoming_available() const { - return buffer_end - in + out - buffer; + return (buffer_end) - in + (out - buffer); } /// Return the address of an incoming data buffer of the requested size. @@ -70,6 +71,7 @@ namespace FreeDV { /// smaller than or equal to the length passed to incoming_buffer(). inline void incoming_done(std::size_t length) { in += length; + assert(in >= buffer && in <= buffer_end); } /// Returns the amount of data available to read. @@ -83,8 +85,8 @@ namespace FreeDV { /// than or equal to the amount returned by outgoing_available(). /// \return The address of the data to be read. inline const uint8_t * outgoing_buffer(std::size_t length) { - if ( length > in - out ) - out_overrun(length); + if ( length > (std::size_t)(in - out) ) + out_overrun(); return out; } @@ -94,6 +96,7 @@ namespace FreeDV { /// outgoing_buffer(). inline void outgoing_done(std::size_t length) { out += length; + assert(out >= buffer && out <= buffer_end); } /// Discard any buffered data. @@ -126,13 +129,13 @@ namespace FreeDV { /// The name of the driver. This must be the same as the name it /// is registered under. It's expected to be from a per-class static /// string and thus should not be deleted. - const char * const + const char * name; /// The parameters to this instance of the driver. They are /// copied here so that we can print them later in operator<<() . /// the copy is deleted when in the ~Base() destructor. - const char * const + const char * parameters; /// Constructor for the virtual base class. @@ -149,7 +152,7 @@ namespace FreeDV { /// should not be destroyed separately. /// The result is invariant for a particular object (or possibly /// class). - virtual bool const + virtual bool captive() const; /// Write the driver information onto a stream, for debugging and @@ -279,7 +282,7 @@ namespace FreeDV { /// Data Bytes provided to decode16 and encode16 must be a multiple /// of this value. The result is invariant for a particular configuration. /// \return The number of data bytes necessary to store a codec frame. - virtual std::size_t const + virtual std::size_t bytes_per_frame() const = 0; /// Decode from data bytes to audio samples. @@ -310,7 +313,7 @@ namespace FreeDV { /// Return the duration of a frame in milliseconds. /// \return The duration of a frame in milliseconds. - virtual int const + virtual int frame_duration() const = 0; /// Return the number of audio samples expected to create a codec @@ -319,7 +322,7 @@ namespace FreeDV { /// data because of the potential for clock skew between stations. /// \return The number of audio samples expected to create a codec /// frame. - virtual std::size_t const + virtual std::size_t samples_per_frame() const = 0; }; @@ -442,7 +445,7 @@ namespace FreeDV { /// \return The maximum number of data bytes expected to store the unwrapped /// codec data. /// frame. - virtual std::size_t const + virtual std::size_t max_unwrapped_bytes_per_frame() const = 0; /// Return the minimum number of data bytes expected to store the unwrapped @@ -450,7 +453,7 @@ namespace FreeDV { /// \return The minimum number of data bytes expected to store the unwrapped /// codec data. /// frame. - virtual std::size_t const + virtual std::size_t min_unwrapped_bytes_per_frame() const = 0; /// Wrap codec data bytes in a protocol for transmission through the modem. @@ -475,7 +478,7 @@ namespace FreeDV { /// \return The maximum number of data bytes expected to store a wrapped /// protocol frame. /// frame. - virtual std::size_t const + virtual std::size_t max_wrapped_bytes_per_frame() const = 0; /// Return the minimum number of data bytes expected to store a wrapped @@ -485,7 +488,7 @@ namespace FreeDV { /// \return The minimum number of data bytes expected to store a wrapped /// protocol frame. /// frame. - virtual std::size_t const + virtual std::size_t min_wrapped_bytes_per_frame() const = 0; }; @@ -526,7 +529,7 @@ namespace FreeDV { /// The data buffer provided to demodulate16 must be a multiple of /// this value. The result is invariant. /// \return The number of data bytes necessary to store a modem frame. - virtual std::size_t const + virtual std::size_t bytes_per_frame() const = 0; /// Demodulate from audio samples to data. @@ -556,7 +559,7 @@ namespace FreeDV { /// Return the duration of a frame in milliseconds. /// \return The duration of a frame in milliseconds. - virtual int const + virtual int frame_duration() const = 0; /// Return the number of audio samples expected to create a modem @@ -565,7 +568,7 @@ namespace FreeDV { /// data due to the potential for clock skew between stations. /// \return The number of audio samples expected to create a codec /// frame. - virtual std::size_t const + virtual std::size_t samples_per_frame() const = 0; }; @@ -638,13 +641,15 @@ namespace FreeDV { class Interfaces { public: Interfaces() : codec(0), event_handler(0), - keying_output(0), loudspeaker(0), microphone(0), - modem(0), ptt_input_digital(0), ptt_input_ssb(0), - receiver(0), text_input(0), transmitter(0), - user_interface(0) + framer(0), keying_output(0), loudspeaker(0), + microphone(0), modem(0), ptt_input_digital(0), + ptt_input_ssb(0), receiver(0), text_input(0), + transmitter(0), user_interface(0) { } + virtual ~Interfaces() final; + /// The voice codec in use. Codec * codec; /// The event loop handler. This is specific to a GUI, or POSIX. @@ -665,12 +670,12 @@ namespace FreeDV { PTTInput * ptt_input_digital; /// The PTT input that indicates the transmission is to be SSB. PTTInput * ptt_input_ssb; + /// The audio input from the receiver. + AudioInput * receiver; /// The text to be transmitted in our text side-channel. TextInput * text_input; /// The audio output that drives the transmitter. AudioOutput * transmitter; - /// The audio input from the receiver. - AudioInput * receiver; /// The user interface driver. Used for GUIs. UserInterface * user_interface; @@ -686,6 +691,7 @@ namespace FreeDV { virtual std::ostream & print(std::ostream & stream) const; }; + /// Write the driver information from the Interfaces object onto a stream, /// for debugging and dumping the configuration information. /// \param stream A reference to an instance of ostream upon which the @@ -743,12 +749,15 @@ namespace FreeDV { inline std::size_t min(std::size_t a, std::size_t b) { - a < b ? a : b; + return a < b ? a : b; } struct DriverList { const char * key; - FreeDV::Base * (*creator)(const char *); + union { + FreeDV::Base * (*creator)(const char *); + FreeDV::Base * (*creator_i)(const char *, Interfaces *); + }; std::ostream & (*enumerator)(std::ostream &); }; @@ -879,5 +888,5 @@ namespace FreeDV { } /// Global reference to the driver manager. - extern DriverManager * const driver_manager(); + extern DriverManager * driver_manager(); } diff --git a/freedv-server/source/fifo.cpp b/freedv-server/source/fifo.cpp index 4edc893d..b498bfa9 100644 --- a/freedv-server/source/fifo.cpp +++ b/freedv-server/source/fifo.cpp @@ -15,7 +15,7 @@ namespace FreeDV { } void - FIFO::out_overrun(std::size_t size) const + FIFO::out_overrun() const { throw std::runtime_error("FIFO outgoing data overrun."); } @@ -30,13 +30,17 @@ namespace FreeDV { // memmove() is specified to handle overlap properly. memmove(buffer, out, bytes); #ifdef DEBUG - std::cerr << "FIFO reorder with copy." << std::endl; + std::cerr << "FIFO reorder with copy. Size = " << size + << ", buffer = " << (void *)buffer << ", buffer_end = " + << (void *)buffer_end << ", in = " << (void *)in + << ", out = " << (void *)out + << std::endl; #endif } out = buffer; in = buffer + bytes; - if ( size > buffer_end - in ) + if ( size > (std::size_t)(buffer_end - in) ) throw std::runtime_error("FIFO incoming data overrun."); return in; diff --git a/freedv-server/source/framer_noop.cpp b/freedv-server/source/framer_noop.cpp index ac8c6c09..bbaa18d4 100644 --- a/freedv-server/source/framer_noop.cpp +++ b/freedv-server/source/framer_noop.cpp @@ -24,7 +24,7 @@ namespace FreeDV { /// \return The maximum number of data bytes expected to store a wrapped /// protocol frame. /// frame. - virtual std::size_t const + virtual std::size_t max_wrapped_bytes_per_frame() const; /// Return the maximum number of data bytes expected to store the unwrapped @@ -32,7 +32,7 @@ namespace FreeDV { /// \return The maximum number of data bytes expected to store the unwrapped /// codec data. /// frame. - virtual std::size_t const + virtual std::size_t max_unwrapped_bytes_per_frame() const; /// Return the minimum number of data bytes expected to store the unwrapped @@ -40,7 +40,7 @@ namespace FreeDV { /// \return The minimum number of data bytes expected to store the unwrapped /// codec data. /// frame. - virtual std::size_t const + virtual std::size_t min_unwrapped_bytes_per_frame() const; /// Return the minimum number of data bytes expected to store a wrapped @@ -50,7 +50,7 @@ namespace FreeDV { /// \return The minimum number of data bytes expected to store a wrapped /// protocol frame. /// frame. - virtual std::size_t const + virtual std::size_t min_wrapped_bytes_per_frame() const; /// Decode from modem data to codec frames, removing the wrapping protocol. @@ -94,25 +94,25 @@ namespace FreeDV { { } - std::size_t const + std::size_t FramerNoOp::max_wrapped_bytes_per_frame() const { return 1; } - std::size_t const + std::size_t FramerNoOp::max_unwrapped_bytes_per_frame() const { return 1; } - std::size_t const + std::size_t FramerNoOp::min_unwrapped_bytes_per_frame() const { return 1; } - std::size_t const + std::size_t FramerNoOp::min_wrapped_bytes_per_frame() const { return 1; @@ -124,7 +124,7 @@ namespace FreeDV { std::size_t * input_length, std::size_t output_length) { - const std::size_t length = std::min(*input_length, output_length); + const std::size_t length = min(*input_length, output_length); memcpy(o, i, length); *input_length = length; return length; @@ -137,7 +137,7 @@ namespace FreeDV { std::size_t * input_length, std::size_t output_length) { - const std::size_t length = std::min(*input_length, output_length); + const std::size_t length = min(*input_length, output_length); memcpy(o, i, length); *input_length = length; return length; diff --git a/freedv-server/source/interfaces.cpp b/freedv-server/source/interfaces.cpp index 387cfebb..0c47e1e9 100644 --- a/freedv-server/source/interfaces.cpp +++ b/freedv-server/source/interfaces.cpp @@ -6,6 +6,10 @@ static const char empty[1] = { '\0' }; namespace FreeDV { + Interfaces::~Interfaces() + { + } + void Interfaces::fill_in() { @@ -19,7 +23,7 @@ namespace FreeDV { loudspeaker = Driver::AudioOutDefault(); if ( !microphone ) - microphone = Driver::Tone(empty); + microphone = Driver::AudioInDefault(); if ( !modem ) modem = Driver::ModemNoOp(empty); diff --git a/freedv-server/source/libevent.cpp b/freedv-server/source/libevent.cpp index 6103c7cf..4e597eb3 100644 --- a/freedv-server/source/libevent.cpp +++ b/freedv-server/source/libevent.cpp @@ -53,13 +53,13 @@ namespace FreeDV { } void - LibEvent::monitor(int fd, unsigned int type, void * private_data, - void (*event)(int fd, unsigned int type, void * private_data)) + LibEvent::monitor(int, unsigned int, void *, + void (*)(int, unsigned int, void *)) { } void - LibEvent::unmonitor(int fd) + LibEvent::unmonitor(int) { } diff --git a/freedv-server/source/modem_noop.cpp b/freedv-server/source/modem_noop.cpp index d4183709..c0eeda04 100644 --- a/freedv-server/source/modem_noop.cpp +++ b/freedv-server/source/modem_noop.cpp @@ -18,7 +18,7 @@ namespace FreeDV { /// The data buffer provided to demodulate16 must be a multiple of /// this value. The result is invariant. /// \return The number of data bytes necessary to store a modem frame. - virtual std::size_t const + virtual std::size_t bytes_per_frame() const; /// Demodulate from audio samples to data. @@ -48,7 +48,7 @@ namespace FreeDV { /// Return the duration of a frame in milliseconds. /// \return The duration of a frame in milliseconds. - virtual int const + virtual int frame_duration() const; /// Return the number of audio samples expected to create a codec @@ -57,7 +57,7 @@ namespace FreeDV { /// invariant for a given SampleRate. /// \return The number of audio samples expected to create a codec /// frame. - virtual std::size_t const + virtual std::size_t samples_per_frame() const; }; @@ -70,7 +70,7 @@ namespace FreeDV { { } - std::size_t const + std::size_t ModemNoOp::bytes_per_frame() const { return sizeof(std::int16_t); @@ -83,9 +83,9 @@ namespace FreeDV { std::size_t * sample_length, std::size_t data_length) { - const std::size_t length = std::min(data_length / 2, *sample_length); + const std::size_t length = min(data_length / 2, *sample_length); memcpy(o, i, length * 2); - *sample_length = length * 2; + *sample_length = length; return length; } @@ -98,13 +98,13 @@ namespace FreeDV { return length / 2; } - int const + int ModemNoOp::frame_duration() const { return 1; } - std::size_t const + std::size_t ModemNoOp::samples_per_frame() const { return 1; diff --git a/freedv-server/source/platform/linux/audio_in_alsa.cpp b/freedv-server/source/platform/linux/audio_in_alsa.cpp index 084581f4..9f2f5290 100644 --- a/freedv-server/source/platform/linux/audio_in_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_in_alsa.cpp @@ -55,7 +55,13 @@ namespace FreeDV { std::size_t AudioInALSA::read16(std::int16_t * array, std::size_t length) { - return length; + const int result = snd_pcm_writei(handle, array, length); + if ( result >= 0 ) + return result; + else { + // FIX: do_throw(result, "Write"); + return 0; // do_throw doesn't return. + } } AudioInput * diff --git a/freedv-server/source/platform/linux/audio_out_alsa.cpp b/freedv-server/source/platform/linux/audio_out_alsa.cpp index 0e30537e..884a1bfb 100644 --- a/freedv-server/source/platform/linux/audio_out_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_out_alsa.cpp @@ -16,7 +16,7 @@ namespace FreeDV { char * const parameters; snd_pcm_t * handle; - volatile void + void do_throw(const int error, const char * message = 0) { std::ostringstream str; @@ -92,8 +92,10 @@ namespace FreeDV { const int result = snd_pcm_writei(handle, array, length); if ( result >= 0 ) return result; - else + else { do_throw(result, "Write"); + return 0; // do_throw doesn't return. + } } AudioOutput * @@ -115,8 +117,10 @@ namespace FreeDV { if ( (available = snd_pcm_avail(handle)) >= 0 ) return available; - else + else { do_throw(available, "Get Available Frames"); + return 0; // do_throw doesn't return. + } } static bool diff --git a/freedv-server/source/run.cpp b/freedv-server/source/run.cpp index b8974241..252ba07e 100644 --- a/freedv-server/source/run.cpp +++ b/freedv-server/source/run.cpp @@ -25,10 +25,10 @@ namespace FreeDV { private: const std::size_t TempSize = 2048; Interfaces * const i; - bool begin_transmit; bool begin_receive; - FIFO input_fifo; + bool begin_transmit; FIFO codec_fifo; + FIFO input_fifo; FIFO output_fifo; bool ptt_digital; bool ptt_ssb; @@ -40,16 +40,16 @@ namespace FreeDV { void transmit_digital(); void transmit_ssb(); public: - int run(); - Run(Interfaces *); ~Run(); + + void run(); }; Run::Run(Interfaces * interfaces) - : begin_receive(true), begin_transmit(false), i(interfaces), - ptt_digital(false), ptt_ssb(false), - input_fifo(TempSize * 2), codec_fifo(TempSize * 2), output_fifo(TempSize * 2) + : i(interfaces), begin_receive(true), begin_transmit(false), + codec_fifo(TempSize * 2), input_fifo(TempSize * 2), + output_fifo(TempSize * 2), ptt_digital(false), ptt_ssb(false) { } @@ -65,53 +65,6 @@ namespace FreeDV { output_fifo.reset(); } - int - Run::run() - { - while ( true ) { - if ( i->ptt_input_digital->ready() ) { - bool state = i->ptt_input_digital->state(); - if ( state && !ptt_digital && !ptt_ssb ) { - ptt_digital = true; - begin_transmit = true; - } - else if ( !state && ptt_digital ) { - begin_receive = true; - ptt_digital = false; - } - } - if ( i->ptt_input_ssb->ready() ) { - bool state = i->ptt_input_ssb->state(); - if ( state && !ptt_digital && !ptt_ssb ) { - ptt_ssb = true; - begin_transmit = true; - } - else if ( !state && ptt_ssb ) { - begin_receive = true; - ptt_ssb = false; - } - } - if ( begin_transmit ) { - reset_fifos(); - key_down(); - } - else if ( begin_receive ) { - reset_fifos(); - key_up(); - } - else if ( ptt_digital ) { - transmit_digital(); - } - else if ( ptt_ssb ) { - transmit_ssb(); - } - else { - receive(); - } - usleep(20100); - } - } - void Run::key_down() { if ( i->keying_output->ready() ) { @@ -141,14 +94,14 @@ namespace FreeDV { Run::receive() { // Drain any data that the loudspeaker can take. - const std::size_t output_samples = std::min( + const std::size_t output_samples = min( i->loudspeaker->ready(), (output_fifo.outgoing_available() / 2)); if ( output_samples ) { const std::size_t result = i->loudspeaker->write16( - (std::int16_t *)output_fifo.outgoing_buffer - (output_samples * 2), + (std::int16_t *)output_fifo.outgoing_buffer( + output_samples * 2), output_samples); if ( result > 0 ) @@ -158,7 +111,7 @@ namespace FreeDV { } // Fill any data that the receiver can provide. - const std::size_t input_samples = std::min( + const std::size_t input_samples = min( i->receiver->ready(), (input_fifo.incoming_available() / 2)); @@ -168,7 +121,7 @@ namespace FreeDV { input_samples); if ( result > 0 ) - output_fifo.outgoing_done(result * 2); + input_fifo.incoming_done(result * 2); else std::cerr << "Loudspeaker I/O error: " << strerror(errno) << std::endl; } @@ -193,7 +146,7 @@ namespace FreeDV { input_fifo.outgoing_done(samples_to_demodulate * 2); if ( result > 0 ) - output_fifo.incoming_done(result * i->modem->bytes_per_frame()); + codec_fifo.incoming_done(result); } const std::size_t frames_to_decode = @@ -222,6 +175,14 @@ namespace FreeDV { } } + void + Run::run() + { + while ( true ) { + receive(); + } + } + void Run::transmit_digital() { @@ -236,6 +197,7 @@ namespace FreeDV { run(Interfaces * i) { Run * r = new Run(i); - return r->run(); + r->run(); + return 0; } } diff --git a/freedv-server/source/test/blank_panel.cpp b/freedv-server/source/test/blank_panel.cpp index 751016fb..af8047e3 100644 --- a/freedv-server/source/test/blank_panel.cpp +++ b/freedv-server/source/test/blank_panel.cpp @@ -27,5 +27,5 @@ protected: }; TEST_F(BlankPanelTest, NeverReady) { - EXPECT_EQ(0, u->ready()); + EXPECT_EQ(0U, u->ready()); } diff --git a/freedv-server/source/test/fifo.cpp b/freedv-server/source/test/fifo.cpp index 42794ad6..5333f5f2 100644 --- a/freedv-server/source/test/fifo.cpp +++ b/freedv-server/source/test/fifo.cpp @@ -24,58 +24,58 @@ protected: }; TEST_F(FIFOTest, CanFillAndDrain) { - ASSERT_EQ(100, f->incoming_available()); + ASSERT_EQ(100U, f->incoming_available()); memset(f->incoming_buffer(100), 255, 100); - ASSERT_EQ(0, f->outgoing_available()); + ASSERT_EQ(0U, f->outgoing_available()); f->incoming_done(100); - ASSERT_EQ(100, f->outgoing_available()); - ASSERT_EQ(0, f->incoming_available()); + ASSERT_EQ(100U, f->outgoing_available()); + ASSERT_EQ(0U, f->incoming_available()); EXPECT_THROW(f->incoming_buffer(1), std::runtime_error); - ASSERT_EQ(100, f->outgoing_available()); + ASSERT_EQ(100U, f->outgoing_available()); ASSERT_NE((uint8_t *)0, f->outgoing_buffer(100)); f->outgoing_done(100); - ASSERT_EQ(0, f->outgoing_available()); - ASSERT_EQ(100, f->incoming_available()); - ASSERT_EQ(100, f->incoming_available()); + ASSERT_EQ(0U, f->outgoing_available()); + ASSERT_EQ(100U, f->incoming_available()); + ASSERT_EQ(100U, f->incoming_available()); memset(f->incoming_buffer(100), 255, 100); - ASSERT_EQ(0, f->outgoing_available()); + ASSERT_EQ(0U, f->outgoing_available()); f->incoming_done(100); - ASSERT_EQ(100, f->outgoing_available()); - ASSERT_EQ(0, f->incoming_available()); + ASSERT_EQ(100U, f->outgoing_available()); + ASSERT_EQ(0U, f->incoming_available()); } TEST_F(FIFOTest, Reorder) { uint8_t * b; const uint8_t * r; - ASSERT_EQ(100, f->incoming_available()); + ASSERT_EQ(100U, f->incoming_available()); ASSERT_NE((uint8_t *)0, b = f->incoming_buffer(99)); memset(b, 0, 98); b[98] = 'b'; f->incoming_done(99); - ASSERT_EQ(1, f->incoming_available()); - ASSERT_EQ(99, f->outgoing_available()); + ASSERT_EQ(1U, f->incoming_available()); + ASSERT_EQ(99U, f->outgoing_available()); ASSERT_NE((uint8_t *)0, f->outgoing_buffer(98)); f->outgoing_done(98); - ASSERT_EQ(1, f->outgoing_available()); - ASSERT_EQ(99, f->incoming_available()); + ASSERT_EQ(1U, f->outgoing_available()); + ASSERT_EQ(99U, f->incoming_available()); // This should cause reorder(). ASSERT_NE((uint8_t *)0, b = f->incoming_buffer(2)); f->incoming_done(0); - ASSERT_EQ(99, f->incoming_available()); - ASSERT_EQ(1, f->outgoing_available()); + ASSERT_EQ(99U, f->incoming_available()); + ASSERT_EQ(1U, f->outgoing_available()); ASSERT_NE((uint8_t *)0, r = f->outgoing_buffer(1)); ASSERT_EQ('b', *r); f->outgoing_done(1); } TEST_F(FIFOTest, CanReset) { - ASSERT_EQ(100, f->incoming_available()); - ASSERT_EQ(0, f->outgoing_available()); + ASSERT_EQ(100U, f->incoming_available()); + ASSERT_EQ(0U, f->outgoing_available()); f->incoming_done(100); - ASSERT_EQ(100, f->outgoing_available()); - ASSERT_EQ(0, f->incoming_available()); + ASSERT_EQ(100U, f->outgoing_available()); + ASSERT_EQ(0U, f->incoming_available()); f->reset(); - ASSERT_EQ(0, f->outgoing_available()); - ASSERT_EQ(100, f->incoming_available()); + ASSERT_EQ(0U, f->outgoing_available()); + ASSERT_EQ(100U, f->incoming_available()); } diff --git a/freedv-server/source/test/ptt_constant.cpp b/freedv-server/source/test/ptt_constant.cpp index d78ea840..75429219 100644 --- a/freedv-server/source/test/ptt_constant.cpp +++ b/freedv-server/source/test/ptt_constant.cpp @@ -46,19 +46,19 @@ protected: }; TEST_F(PTTInputTransmitTest, ReadyAndRead) { - EXPECT_EQ(1, i->ready()); - EXPECT_EQ(1, i->ready()); + EXPECT_EQ(1U, i->ready()); + EXPECT_EQ(1U, i->ready()); EXPECT_TRUE(i->state()); - EXPECT_EQ(0, i->ready()); - EXPECT_EQ(0, i->ready()); + EXPECT_EQ(0U, i->ready()); + EXPECT_EQ(0U, i->ready()); EXPECT_THROW(i->state(), std::runtime_error); } TEST_F(PTTInputReceiveTest, ReadyAndRead) { - EXPECT_EQ(1, i->ready()); - EXPECT_EQ(1, i->ready()); + EXPECT_EQ(1U, i->ready()); + EXPECT_EQ(1U, i->ready()); EXPECT_FALSE(i->state()); - EXPECT_EQ(0, i->ready()); - EXPECT_EQ(0, i->ready()); + EXPECT_EQ(0U, i->ready()); + EXPECT_EQ(0U, i->ready()); EXPECT_THROW(i->state(), std::runtime_error); } diff --git a/freedv-server/source/test/text_constant.cpp b/freedv-server/source/test/text_constant.cpp index 0f590e5a..8a01adaa 100644 --- a/freedv-server/source/test/text_constant.cpp +++ b/freedv-server/source/test/text_constant.cpp @@ -31,11 +31,11 @@ TEST_F(TextConstantTest, ReadyAndRead) { char buffer[1024]; EXPECT_EQ(sizeof(text) - 1, i->ready()); - EXPECT_EQ(10, i->read(buffer, 10)); + EXPECT_EQ(10U, i->read(buffer, 10)); EXPECT_EQ(sizeof(text) - 1 - 10, i->ready()); - EXPECT_EQ(0, i->read(buffer, 0)); + EXPECT_EQ(0U, i->read(buffer, 0)); EXPECT_EQ(sizeof(text) - 1 - 10, i->ready()); EXPECT_EQ(sizeof(text) - 1 - 10, i->read(buffer, sizeof(buffer))); - EXPECT_EQ(0, i->ready()); + EXPECT_EQ(0U, i->ready()); EXPECT_THROW(i->read(buffer, sizeof(buffer)), std::runtime_error); } diff --git a/freedv-server/source/text_constant.cpp b/freedv-server/source/text_constant.cpp index 25e57ad9..90f7eea5 100644 --- a/freedv-server/source/text_constant.cpp +++ b/freedv-server/source/text_constant.cpp @@ -8,8 +8,8 @@ namespace FreeDV { /// This driver provides constant text. class TextConstant : public TextInput { private: - const std::size_t length; std::size_t index; + const std::size_t length; public: /// Instantiate the constant text driver. diff --git a/freedv-server/source/tone.cpp b/freedv-server/source/tone.cpp index e444a0dd..dff8937a 100644 --- a/freedv-server/source/tone.cpp +++ b/freedv-server/source/tone.cpp @@ -116,6 +116,8 @@ namespace FreeDV { array[i] = (std::int16_t)rint(value * master_amplitude * ((1 << 15) - 1)); } clock = (clock + length) % SampleRate; + + return length; } std::size_t diff --git a/freedv-server/source/user_interface.cpp b/freedv-server/source/user_interface.cpp index 5a74388e..95497c93 100644 --- a/freedv-server/source/user_interface.cpp +++ b/freedv-server/source/user_interface.cpp @@ -3,7 +3,7 @@ #include "drivers.h" namespace FreeDV { - UserInterface::UserInterface(const char * name, const char * parameters, Interfaces * interfaces) + UserInterface::UserInterface(const char * name, const char * parameters, Interfaces *) : IODevice(name, parameters) { }