root/branches/api-cleanup/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.h

Revision 816, 5.6 kB (checked in by ppalmers, 16 years ago)

remove support for per-port datatypes. It's too much hassle and it doesn't add enough value.
It also prevents thorough performance optimizations, especially for larger channel counts (e.g. SSE based).

Audio ports are now either all float or all int24. This can be specified by the ffado_streaming_set_audio_datatype
API function before the streaming is prepared. Hence we can still support the direct conversion to the
clients datatype when demuxing the packets.

Line 
1 /*
2  * Copyright (C) 2005-2007 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 3 of the License, or
12  * (at your option) any later version.
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 generateSilentPacketHeader(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 generateSilentPacketData(unsigned char *data, unsigned int *length,
92                                   unsigned char *tag, unsigned char *sy,
93                                   int cycle, unsigned int dropped, unsigned int max_length);
94     virtual bool prepareChild();
95
96 public:
97     virtual unsigned int getEventSize()
98                     {return 4;};
99     virtual unsigned int getMaxPacketSize()
100                     {return 4 * (2 + getSytInterval() * m_dimension);};
101     virtual unsigned int getEventsPerFrame()
102                     { return m_dimension; };
103     virtual unsigned int getNominalFramesPerPacket()
104                     {return getSytInterval();};
105
106 protected:
107     bool processWriteBlock(char *data, unsigned int nevents, unsigned int offset);
108     bool transmitSilenceBlock(char *data, unsigned int nevents, unsigned int offset);
109
110 private:
111     unsigned int fillNoDataPacketHeader(struct iec61883_packet *packet, unsigned int* length);
112     unsigned int fillDataPacketHeader(struct iec61883_packet *packet, unsigned int* length, uint32_t ts);
113
114     int transmitBlock(char *data, unsigned int nevents,
115                         unsigned int offset);
116
117     int encodePortToMBLAEvents(AmdtpAudioPort *, quadlet_t *data,
118                                unsigned int offset, unsigned int nevents);
119     int encodePortToMidiEvents(AmdtpMidiPort *p, quadlet_t *data,
120                                unsigned int offset, unsigned int nevents);
121     int encodeSilencePortToMBLAEvents(AmdtpAudioPort *, quadlet_t *data,
122                                       unsigned int offset, unsigned int nevents);
123     int encodeSilencePortToMidiEvents(AmdtpMidiPort *p, quadlet_t *data,
124                                       unsigned int offset, unsigned int nevents);
125
126     bool encodeAudioPorts(quadlet_t *data, unsigned int offset, unsigned int nevents);
127
128     unsigned int getFDF();
129     unsigned int getSytInterval();
130
131     struct iec61883_cip m_cip_status;
132     int m_dimension;
133     unsigned int m_syt_interval;
134     int m_fdf;
135     unsigned int m_dbc;
136
137 private: // local port caching for performance
138     struct _MBLA_port_cache {
139         AmdtpAudioPort*     port;
140         void*               buffer;
141 #ifdef DEBUG
142         unsigned int        buffer_size;
143 #endif
144     };
145     std::vector<struct _MBLA_port_cache> m_audio_ports;
146     unsigned int m_nb_audio_ports;
147     unsigned int m_nb_midi_ports;
148
149     bool initPortCache();
150     void updatePortCache();
151
152 };
153
154 } // end of namespace Streaming
155
156 #endif /* __FFADO_AMDTPTRANSMITSTREAMPROCESSOR__ */
157
Note: See TracBrowser for help on using the browser.