root/trunk/libffado/src/libutil/PacketBuffer.cpp

Revision 419, 4.0 kB (checked in by pieterpalmers, 17 years ago)

namespace simplification

Line 
1 /* $Id$ */
2
3 /*
4  *   FreeBob Streaming API
5  *   FreeBob = Firewire (pro-)audio for linux
6  *
7  *   http://freebob.sf.net
8  *
9  *   Copyright (C) 2005,2006 Pieter Palmers <pieterpalmers@users.sourceforge.net>
10  *
11  *   This program is free software {} you can redistribute it and/or modify
12  *   it under the terms of the GNU General Public License as published by
13  *   the Free Software Foundation {} either version 2 of the License, or
14  *   (at your option) any later version.
15  *
16  *   This program is distributed in the hope that it will be useful,
17  *   but WITHOUT ANY WARRANTY {} without even the implied warranty of
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *   GNU General Public License for more details.
20  *
21  *   You should have received a copy of the GNU General Public License
22  *   along with this program {} if not, write to the Free Software
23  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  *
26  *
27  */
28
29 #include "PacketBuffer.h"
30 #include <assert.h>
31
32
33 namespace Streaming {
34
35 IMPL_DEBUG_MODULE( PacketBuffer, PacketBuffer, DEBUG_LEVEL_VERBOSE );
36
37
38 PacketBuffer::~PacketBuffer() {
39         if(payload_buffer) freebob_ringbuffer_free(payload_buffer);
40         if(header_buffer) freebob_ringbuffer_free(header_buffer);
41         if(len_buffer) freebob_ringbuffer_free(len_buffer);
42 }
43
44 int PacketBuffer::initialize() {
45         debugOutput( DEBUG_LEVEL_VERBOSE, "enter...\n");
46
47         if(payload_buffer) freebob_ringbuffer_free(payload_buffer);
48         if(header_buffer) freebob_ringbuffer_free(header_buffer);
49         if(len_buffer) freebob_ringbuffer_free(len_buffer);
50
51         payload_buffer=freebob_ringbuffer_create(m_buffersize * m_max_packetsize * sizeof(quadlet_t));
52         if(!payload_buffer) {
53                 debugFatal("Could not allocate payload buffer\n");
54                 return -1;
55         }
56
57         header_buffer=freebob_ringbuffer_create(m_buffersize * (m_headersize) * sizeof(quadlet_t));
58         if(!header_buffer) {
59                 debugFatal("Could not allocate header buffer\n");
60                 return -1;
61         }
62
63         len_buffer=freebob_ringbuffer_create(m_buffersize * sizeof(unsigned int));
64         if(!len_buffer) {
65                 debugFatal("Could not allocate len buffer\n");
66                 return -1;
67         }
68         debugOutput( DEBUG_LEVEL_VERBOSE, "exit...\n");
69
70         return 0;
71 }
72
73 void PacketBuffer::flush() {
74         if(header_buffer) {
75                 freebob_ringbuffer_reset(header_buffer);
76         }
77         if(payload_buffer) {
78                 freebob_ringbuffer_reset(payload_buffer);
79         }
80         if(len_buffer) {
81                 freebob_ringbuffer_reset(len_buffer);
82         }
83 }
84
85 int PacketBuffer::addPacket(quadlet_t *packet, int packet_len) {
86
87         unsigned int payload_bytes=sizeof(quadlet_t)*(packet_len-m_headersize);
88         unsigned int header_bytes=sizeof(quadlet_t)*(m_headersize);
89
90         debugOutput( DEBUG_LEVEL_VERY_VERBOSE,
91                      "add packet: length=%d\n",
92                      packet_len);
93
94         if ((freebob_ringbuffer_write_space(payload_buffer) > payload_bytes)
95             && (freebob_ringbuffer_write_space(header_buffer) > header_bytes)) {
96
97                 freebob_ringbuffer_write(payload_buffer,(char *)(packet)+header_bytes, payload_bytes);
98                 freebob_ringbuffer_write(len_buffer,(char *)(&payload_bytes),sizeof(unsigned int));
99                 freebob_ringbuffer_write(header_buffer,(char *)(packet), header_bytes);
100
101         } else return -1;
102         return 0;
103
104 }
105
106 int PacketBuffer::getNextPacket(quadlet_t *packet, int max_packet_len) {
107
108         unsigned int bytes=sizeof(quadlet_t)*(m_headersize);
109         quadlet_t *ptr=packet+m_headersize;
110
111         debugOutput( DEBUG_LEVEL_VERY_VERBOSE,
112                      "getNextPacket\n");
113
114         if(max_packet_len<m_headersize) return -2;
115
116         if (freebob_ringbuffer_read(header_buffer,(char *)packet,bytes) < bytes) {
117                 return -1;
118         }
119
120         if (freebob_ringbuffer_read(len_buffer,(char *)&bytes, sizeof(unsigned int)) < sizeof(unsigned int)) {
121                 return -3;
122         }
123
124         if(bytes>(max_packet_len-m_headersize)*sizeof(quadlet_t)) return -2;
125
126         if(freebob_ringbuffer_read(payload_buffer,(char *)(ptr),bytes) < bytes) {
127                 return -3;
128         }
129
130         return bytes/sizeof(quadlet_t)+m_headersize;
131 }
132
133 int PacketBuffer::getBufferFillPackets() {
134
135         return freebob_ringbuffer_read_space(len_buffer)/sizeof(unsigned int);
136 }
137
138 // in quadlets
139 int PacketBuffer::getBufferFillPayload() {
140
141         return freebob_ringbuffer_read_space(payload_buffer)/sizeof(quadlet_t);
142 }
143
144 }
Note: See TracBrowser for help on using the browser.