root/trunk/libffado/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.h

Revision 864, 6.2 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_AMDTPTRANSMITSTREAMPROCESSOR__
25 #define __FFADO_AMDTPTRANSMITSTREAMPROCESSOR__
26
27 /**
28  * This class implements IEC61883-6 / AM824 / AMDTP based streaming
29  */
30
31 #include "debugmodule/debugmodule.h"
32
33 #include "../generic/StreamProcessor.h"
34 #include "../util/cip.h"
35
36 #include <libiec61883/iec61883.h>
37 #include <pthread.h>
38
39 #define AMDTP_MAX_PACKET_SIZE 2048
40
41 #define IEC61883_STREAM_TYPE_MIDI   0x0D
42 #define IEC61883_STREAM_TYPE_SPDIF  0x00
43 #define IEC61883_STREAM_TYPE_MBLA   0x06
44
45 #define IEC61883_AM824_LABEL_MASK             0xFF000000
46 #define IEC61883_AM824_GET_LABEL(x)         (((x) & 0xFF000000) >> 24)
47 #define IEC61883_AM824_SET_LABEL(x,y)         ((x) | ((y)<<24))
48
49 #define IEC61883_AM824_LABEL_MIDI_NO_DATA     0x80
50 #define IEC61883_AM824_LABEL_MIDI_1X          0x81
51 #define IEC61883_AM824_LABEL_MIDI_2X          0x82
52 #define IEC61883_AM824_LABEL_MIDI_3X          0x83
53
54 namespace Streaming {
55
56 class Port;
57 class AmdtpAudioPort;
58 class AmdtpMidiPort;
59
60 /*!
61 \brief The Base Class for an AMDTP transmit stream processor
62
63  This class implements a TransmitStreamProcessor that multiplexes Ports
64  into AMDTP streams.
65
66 */
67 class AmdtpTransmitStreamProcessor
68     : public StreamProcessor
69 {
70
71 public:
72     /**
73      * Create a AMDTP transmit StreamProcessor
74      * @param port 1394 port
75      * @param framerate frame rate
76      * @param dimension number of substreams in the ISO stream
77      *                  (midi-muxed is only one stream)
78      */
79     AmdtpTransmitStreamProcessor(FFADODevice &parent, int dimension);
80     virtual ~AmdtpTransmitStreamProcessor() {};
81
82     enum eChildReturnValue generatePacketHeader(unsigned char *data, unsigned int *length,
83                               unsigned char *tag, unsigned char *sy,
84                               int cycle, unsigned int dropped, unsigned int max_length);
85     enum eChildReturnValue generatePacketData(unsigned char *data, unsigned int *length,
86                             unsigned char *tag, unsigned char *sy,
87                             int cycle, unsigned int dropped, unsigned int max_length);
88     enum eChildReturnValue generateEmptyPacketHeader(unsigned char *data, unsigned int *length,
89                                     unsigned char *tag, unsigned char *sy,
90                                     int cycle, unsigned int dropped, unsigned int max_length);
91     enum eChildReturnValue generateEmptyPacketData(unsigned char *data, unsigned int *length,
92                                   unsigned char *tag, unsigned char *sy,
93                                   int cycle, unsigned int dropped, unsigned int max_length);
94     enum eChildReturnValue generateSilentPacketHeader(unsigned char *data, unsigned int *length,
95                                     unsigned char *tag, unsigned char *sy,
96                                     int cycle, unsigned int dropped, unsigned int max_length);
97     enum eChildReturnValue generateSilentPacketData(unsigned char *data, unsigned int *length,
98                                   unsigned char *tag, unsigned char *sy,
99                                   int cycle, unsigned int dropped, unsigned int max_length);
100     virtual bool prepareChild();
101
102 public:
103     virtual unsigned int getEventSize()
104                     {return 4;};
105     virtual unsigned int getMaxPacketSize()
106                     {return 4 * (2 + getSytInterval() * m_dimension);};
107     virtual unsigned int getEventsPerFrame()
108                     { return m_dimension; };
109     virtual unsigned int getNominalFramesPerPacket()
110                     {return getSytInterval();};
111
112 protected:
113     bool processWriteBlock(char *data, unsigned int nevents, unsigned int offset);
114     bool transmitSilenceBlock(char *data, unsigned int nevents, unsigned int offset);
115
116 private:
117     unsigned int fillNoDataPacketHeader(struct iec61883_packet *packet, unsigned int* length);
118     unsigned int fillDataPacketHeader(struct iec61883_packet *packet, unsigned int* length, uint32_t ts);
119
120     int transmitBlock(char *data, unsigned int nevents,
121                         unsigned int offset);
122
123     void encodeAudioPortsSilence(quadlet_t *data, unsigned int offset, unsigned int nevents);
124     void encodeAudioPortsFloat(quadlet_t *data, unsigned int offset, unsigned int nevents);
125     void encodeAudioPortsInt24(quadlet_t *data, unsigned int offset, unsigned int nevents);
126     void encodeMidiPortsSilence(quadlet_t *data, unsigned int offset, unsigned int nevents);
127     void encodeMidiPorts(quadlet_t *data, unsigned int offset, unsigned int nevents);
128
129     unsigned int getFDF();
130     unsigned int getSytInterval();
131
132     struct iec61883_cip m_cip_status;
133     int m_dimension;
134     unsigned int m_syt_interval;
135     int m_fdf;
136     unsigned int m_dbc;
137
138 private: // local port caching for performance
139     struct _MBLA_port_cache {
140         AmdtpAudioPort*     port;
141         void*               buffer;
142         bool                enabled;
143 #ifdef DEBUG
144         unsigned int        buffer_size;
145 #endif
146     };
147     std::vector<struct _MBLA_port_cache> m_audio_ports;
148     unsigned int m_nb_audio_ports;
149
150     struct _MIDI_port_cache {
151         AmdtpMidiPort*      port;
152         void*               buffer;
153         bool                enabled;
154         unsigned int        position;
155         unsigned int        location;
156 #ifdef DEBUG
157         unsigned int        buffer_size;
158 #endif
159     };
160     std::vector<struct _MIDI_port_cache> m_midi_ports;
161     unsigned int m_nb_midi_ports;
162
163     bool initPortCache();
164     void updatePortCache();
165 };
166
167 } // end of namespace Streaming
168
169 #endif /* __FFADO_AMDTPTRANSMITSTREAMPROCESSOR__ */
170
Note: See TracBrowser for help on using the browser.