root/trunk/libffado/src/bounce/bounce_avdevice.h

Revision 2691, 4.0 kB (checked in by jwoithe, 7 years ago)

Initial attempt to address deprecation of auto_ptr.

C++11 deprecates auto_ptr, and gcc6 (and later versions) print compile time
warnings to this effect whenever it is encountered in the source. The
replacement type is either shared_ptr or unique_ptr depending on the usage.
For almost all usages within FFADO it seems unique_ptr could be the
appropriate choice, but the symantics are a little different to auto_ptr.
Shared_ptr on the other hand can be a drop-in replacement, although it comes
with considerable overheads which unique_ptr avoids. In the context of the
current usage, the extra overhead incurred is not critical.

The code-base cannot at this time change unconditionally to shared_ptr and
unique_ptr because these are not available in gcc4 unless "--std=c++11" is
given. When gcc4 is used certain older versions of dependent libraries must
be used and these in turn will cause compile failures in their header files
if "--std=c++11" is used (libxml++ being an example). At present there are
sufficient users of FFADO still on gcc4 to justify maintaining compatibility
with that gcc version.

The approach adopted at present is to define ffado_smartptr to be either
auto_ptr (if c++11 is not in use) or shared_ptr if it is. All auto_ptr
instances are then changed to ffado_smartptr. This should allow FFADO to be
compiled without errors or warnings on systems using gcc4 and above. Gcc6
defaults to the c++14 standard, so ffado_smartptr will be shared_ptr in that
case; thus the warnings will be avoided.

In time, once gcc4 drops out of common use, the ffado_smartptr instances can
be progressively migrated to unique_ptr or shared_ptr as is appropriate. It
has been pointed out in the ffado-devel mailing list by Jano Svitok (2 May
2017, subject "smart pointers Was: [FFADO-devel] Liquid Saffire 56") that
bebob_dl_mgr.cpp could use unique_ptr. shared_ptr should be ok in other
auto_ptr sites, but futher analysis may show that at least some of them can
use unique_ptr.

The addressing of the auto_ptr issue was prompted by Xavier Forestier's
patch set submitted to ffado-devel in November 2016.

Line 
1 /*
2  * Copyright (C) 2005-2008 by Pieter Palmers
3  * Copyright (C) 2005-2008 by Daniel Wagner
4  *
5  * This file is part of FFADO
6  * FFADO = Free Firewire (pro-)audio drivers for linux
7  *
8  * FFADO is based upon FreeBoB
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 2 of the License, or
13  * (at your option) version 3 of the License.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  */
24
25 #ifndef BOUNCEDEVICE_H
26 #define BOUNCEDEVICE_H
27
28 #include "debugmodule/debugmodule.h"
29 #include "libavc/avc_definitions.h"
30 #include "libavc/general/avc_extended_cmd_generic.h"
31
32 #include "libstreaming/amdtp/AmdtpReceiveStreamProcessor.h"
33 #include "libstreaming/amdtp/AmdtpTransmitStreamProcessor.h"
34 #include "libstreaming/amdtp/AmdtpPort.h"
35 #include "libstreaming/amdtp/AmdtpPortInfo.h"
36
37 #include "libieee1394/ieee1394service.h"
38
39 #include "ffadodevice.h"
40
41 #include <vector>
42
43 #define BOUNCE_REGISTER_BASE 0x0000FFFFE0000000ULL
44 #define BOUNCE_REGISTER_LENGTH (4*256)
45 #define BOUNCE_REGISTER_TX_ISOCHANNEL 0x10
46 #define BOUNCE_REGISTER_RX_ISOCHANNEL 0x14
47 #define BOUNCE_INVALID_OFFSET 0xFFFFF00000000000ULL
48
49 #define BOUNCE_NB_AUDIO_CHANNELS 4
50
51 // don't define more than 8 midi channels!
52 #define BOUNCE_NB_MIDI_CHANNELS  2
53
54 class ConfigRom;
55 class DeviceManager;
56
57 namespace Util {
58     class Configuration;
59 }
60
61 namespace Bounce {
62
63 class Device : public FFADODevice {
64 private:
65     class BounceNotifier;
66 public:
67     Device( DeviceManager& d, ffado_smartptr<ConfigRom>( configRom ));
68     virtual ~Device();
69
70     static bool probe( Util::Configuration&, ConfigRom& configRom, bool generic = false );
71     static FFADODevice * createDevice( DeviceManager& d, ffado_smartptr<ConfigRom>( configRom ));
72     virtual bool discover();
73
74     virtual bool setSamplingFrequency( int samplingFrequency );
75     virtual int getSamplingFrequency( );
76    
77     virtual ClockSourceVector getSupportedClockSources();
78     virtual bool setActiveClockSource(ClockSource);
79     virtual ClockSource getActiveClockSource();
80
81     virtual std::vector<int> getSupportedSamplingFrequencies();
82
83     virtual bool prepare();
84     virtual bool lock();
85     virtual bool unlock();
86
87     virtual int getStreamCount();
88
89     virtual Streaming::StreamProcessor *getStreamProcessorByIndex(int i);
90
91     virtual bool startStreamByIndex(int i);
92     virtual bool stopStreamByIndex(int i);
93
94     virtual void showDevice();
95
96 protected:
97     unsigned int m_samplerate;
98
99     // streaming stuff
100     typedef std::vector< Streaming::StreamProcessor * > StreamProcessorVector;
101     StreamProcessorVector m_receiveProcessors;
102     StreamProcessorVector m_transmitProcessors;
103
104     bool addPortsToProcessor(
105        Streaming::StreamProcessor *processor,
106        Streaming::Port::E_Direction direction);
107
108 private: // generic helpers
109     int allocateIsoChannel(unsigned int packet_size);
110     bool deallocateIsoChannel(int channel);
111
112 protected: // I/O helpers
113     // quadlet read/write routines
114     bool readReg(fb_nodeaddr_t, fb_quadlet_t *);
115     bool writeReg(fb_nodeaddr_t, fb_quadlet_t);
116     bool readRegBlock(fb_nodeaddr_t, fb_quadlet_t *, size_t);
117     bool writeRegBlock(fb_nodeaddr_t, fb_quadlet_t *, size_t);
118
119 private:
120     BounceNotifier *m_Notifier;
121     /**
122      * this class reacts on the other side writing to the
123      * hosts address space
124      */
125     #define BOUNCE_NOTIFIER_BASE_ADDRESS 0x0000FFFFE0000000ULL
126     #define BOUNCE_NOTIFIER_BLOCK_LENGTH 4
127     class BounceNotifier : public Ieee1394Service::ARMHandler
128     {
129     public:
130         BounceNotifier(Device &, nodeaddr_t start);
131         virtual ~BounceNotifier();
132
133     private:
134         Device &m_bouncedevice;
135     };
136 };
137
138 }
139
140 #endif
Note: See TracBrowser for help on using the browser.