root/trunk/libffado/src/libieee1394/IsoHandler.h

Revision 864, 5.3 kB (checked in by ppalmers, 13 years ago)

update license to GPLv2 or GPLv3 instead of GPLv2 or any later version. Update copyrights to reflect the new year

Line 
1 /*
2  * Copyright (C) 2005-2008 by Pieter Palmers
3  *
4  * This file is part of FFADO
5  * FFADO = Free Firewire (pro-)audio drivers for linux
6  *
7  * FFADO is based upon FreeBoB.
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) version 3 of the License.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  */
23
24 #ifndef __FFADO_ISOHANDLER__
25 #define __FFADO_ISOHANDLER__
26
27 #include "debugmodule/debugmodule.h"
28 #include "IsoHandlerManager.h"
29
30 #include "libutil/Thread.h"
31
32 enum raw1394_iso_disposition;
33
34 namespace Streaming {
35     class StreamProcessor;
36 }
37
38 /*!
39 \brief The Base Class for ISO Handlers
40
41  These classes perform the actual ISO communication through libraw1394.
42  They are different from Streaming::StreamProcessors because one handler can provide multiple
43  streams with packets in case of ISO multichannel receive.
44
45 */
46
47 class IsoHandler : public Util::RunnableInterface
48 {
49 public:
50     enum EHandlerType {
51             eHT_Receive,
52             eHT_Transmit
53     };
54     IsoHandler(IsoHandlerManager& manager, enum EHandlerType t);
55     IsoHandler(IsoHandlerManager& manager, enum EHandlerType t,
56                unsigned int buf_packets, unsigned int max_packet_size, int irq);
57     IsoHandler(IsoHandlerManager& manager, enum EHandlerType t,
58                unsigned int buf_packets, unsigned int max_packet_size, int irq, enum raw1394_iso_speed speed);
59     ~IsoHandler();
60
61 private: // the ISO callback interface
62     static enum raw1394_iso_disposition
63     iso_receive_handler(raw1394handle_t handle, unsigned char *data,
64                         unsigned int length, unsigned char channel,
65                         unsigned char tag, unsigned char sy, unsigned int cycle,
66                         unsigned int dropped);
67
68     enum raw1394_iso_disposition
69             putPacket(unsigned char *data, unsigned int length,
70                         unsigned char channel, unsigned char tag, unsigned char sy,
71                         unsigned int cycle, unsigned int dropped);
72
73     static enum raw1394_iso_disposition iso_transmit_handler(raw1394handle_t handle,
74                     unsigned char *data, unsigned int *length,
75                     unsigned char *tag, unsigned char *sy,
76                     int cycle, unsigned int dropped);
77     enum raw1394_iso_disposition
78             getPacket(unsigned char *data, unsigned int *length,
79                     unsigned char *tag, unsigned char *sy,
80                     int cycle, unsigned int dropped);
81
82 public:
83     // runnable interface
84     bool Init();
85     bool Execute();
86     bool iterate();
87
88     int getFileDescriptor() { return raw1394_get_fd(m_handle);};
89     bool setThreadParameters(bool rt, int priority);
90
91     bool init();
92     bool prepare();
93
94     void setVerboseLevel(int l);
95
96     bool enable() {return enable(-1);};
97     bool enable(int cycle);
98     bool disable();
99
100     void flush();
101     enum EHandlerType getType() {return m_type;};
102     const char *getTypeString() {return eHTToString(m_type); };
103
104     // pretty printing
105     const char *eHTToString(enum EHandlerType);
106
107     bool isEnabled()
108         {return m_State == E_Running;};
109
110     // no setter functions, because those would require a re-init
111     unsigned int getMaxPacketSize() { return m_max_packet_size;};
112     unsigned int getNbBuffers() { return m_buf_packets;};
113     int getPacketLatency() { return m_irq_interval;};
114
115     int getPacketCount() {return m_packetcount;};
116     void resetPacketCount() {m_packetcount=0;};
117
118     int getDroppedCount() {return m_dropped;};
119     void resetDroppedCount() {m_dropped=0;};
120
121     unsigned int getPreBuffers() {return m_prebuffers;};
122     void setPreBuffers(unsigned int n) {m_prebuffers=n;};
123
124     void dumpInfo();
125
126     bool inUse() {return (m_Client != 0) ;};
127     bool isStreamRegistered(Streaming::StreamProcessor *s) {return (m_Client == s);};
128
129     bool registerStream(Streaming::StreamProcessor *);
130     bool unregisterStream(Streaming::StreamProcessor *);
131
132     bool waitForClient();
133     bool tryWaitForClient();
134
135 private:
136     IsoHandlerManager& m_manager;
137     enum EHandlerType m_type;
138     raw1394handle_t m_handle;
139     unsigned int    m_buf_packets;
140     unsigned int    m_max_packet_size;
141     int             m_irq_interval;
142
143     int m_packetcount;
144     int m_dropped;
145     Streaming::StreamProcessor *m_Client;
146
147     int handleBusReset(unsigned int generation);
148
149     static int busreset_handler(raw1394handle_t handle, unsigned int generation);
150
151     struct pollfd   m_poll_fd;
152     int             m_poll_timeout;
153     // threading
154     bool            m_realtime;
155     int             m_priority;
156     Util::Thread *  m_Thread;
157
158     enum raw1394_iso_speed m_speed;
159     unsigned int m_prebuffers;
160
161     // the state machine
162     enum EHandlerStates {
163         E_Created,
164         E_Initialized,
165         E_Prepared,
166         E_Running,
167         E_Error
168     };
169     enum EHandlerStates m_State;
170     DECLARE_DEBUG_MODULE;
171 };
172
173 #endif /* __FFADO_ISOHANDLER__  */
174
175
176
Note: See TracBrowser for help on using the browser.