xref: /haiku/src/apps/cortex/InfoView/ConnectionInfoView.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /*
2  * Copyright (c) 1999-2000, Eric Moon.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions, and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions, and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 
32 // ConnectionInfoView.cpp
33 
34 #include "ConnectionInfoView.h"
35 // InfoView
36 #include "InfoWindowManager.h"
37 // Support
38 #include "MediaIcon.h"
39 #include "MediaString.h"
40 // NodeManager
41 #include "Connection.h"
42 
43 // MediaKit
44 #include <MediaDefs.h>
45 
46 __USE_CORTEX_NAMESPACE
47 
48 #include <Debug.h>
49 #define D_METHOD(x) //PRINT (x)
50 #define D_MESSAGE(x) //PRINT (x)
51 
52 // -------------------------------------------------------- //
53 // *** ctor/dtor (public)
54 // -------------------------------------------------------- //
55 
56 ConnectionInfoView::ConnectionInfoView(
57 	const Connection &connection)
58 	: InfoView("Connection", "", 0),
59 	  m_source(connection.source()),
60 	  m_destination(connection.destination())
61 {
62 	D_METHOD(("ConnectionInfoView::ConnectionInfoView()\n"));
63 
64 	setSideBarWidth(be_plain_font->StringWidth(" Destination ")
65 					+ 2 * InfoView::M_H_MARGIN);
66 	media_input input;
67 	media_output output;
68 	if (connection.getOutput(&output) == B_OK) {
69 		// add "Source" field
70 		BString s;
71 		s << output.name;
72 		if (s.Length() > 0)
73 			s << " ";
74 		s << "(" << MediaString::getStringFor(output.source) << ")";
75 		addField("Source", s);
76 	}
77 	if (connection.getInput(&input) == B_OK) {
78 		// add "Destination" field
79 		BString s;
80 		s << input.name;
81 		if (s.Length() > 0)
82 			s << " ";
83 		s << "(" << MediaString::getStringFor(input.destination) << ")";
84 		addField("Destination", s);
85 	}
86 
87 	// add a separator field
88 	addField("", "");
89 
90 	// add "Media Type" field
91 	addField("Media Type", MediaString::getStringFor(connection.format().type));
92 
93 	// add the format fields
94 	_addFormatFields(connection.format());
95 }
96 
97 ConnectionInfoView::~ConnectionInfoView()
98 {
99 	D_METHOD(("ConnectionInfoView::~ConnectionInfoView()\n"));
100 }
101 
102 // -------------------------------------------------------- //
103 // *** internal operations (private)
104 // -------------------------------------------------------- //
105 
106 void ConnectionInfoView::_addFormatFields(
107 	const media_format &format) {
108 	D_METHOD(("ConnectionInfoView::_addFormatFields()\n"));
109 
110 	switch (format.type) {
111 		case B_MEDIA_RAW_AUDIO: {
112 			// adjust view properties
113 			setSideBarWidth(be_plain_font->StringWidth(" Sample Rate ") + 2 * InfoView::M_H_MARGIN);
114 			BString s;
115 			// add "Format" field
116 			s = MediaString::forAudioFormat(format.u.raw_audio.format,
117 											format.u.raw_audio.valid_bits);
118 			addField("Format", s);
119 			// add "Sample Rate" field
120 			s = MediaString::forAudioFrameRate(format.u.raw_audio.frame_rate);
121 			addField("Sample Rate", s);
122 			// add "Channels" field
123 			s = MediaString::forAudioChannelCount(format.u.raw_audio.channel_count);
124 			addField("Channels", s);
125 			// add "Channel Mask" field
126 			s = MediaString::forAudioChannelMask(format.u.raw_audio.channel_mask);
127 			addField("Channel Mask", s);
128 			// add "Matrix Mask" field
129 			s = MediaString::forAudioMatrixMask(format.u.raw_audio.matrix_mask);
130 			addField("Matrix Mask", s);
131 			// add the "Byte Order" field
132 			s = MediaString::forAudioByteOrder(format.u.raw_audio.byte_order);
133 			addField("Byte Order", s);
134 			// add the "Buffer Size" field
135 			s = MediaString::forAudioBufferSize(format.u.raw_audio.buffer_size);
136 			addField("Buffer Size", s);
137 			break;
138 		}
139 		case B_MEDIA_RAW_VIDEO: {
140 			// adjust view properties
141 			setSideBarWidth(be_plain_font->StringWidth(" Video Data Between ") + 2 * InfoView::M_H_MARGIN);
142 			BString s;
143 			// add the "Format" field
144 			s = MediaString::forVideoFormat(format.u.raw_video.display.format);
145 			addField("Format", s);
146 			// add the "Resolution" field
147 			s = MediaString::forVideoResolution(format.u.raw_video.display.line_width,
148 												format.u.raw_video.display.line_count);
149 			addField("Resolution", s);
150 			// add the "Field Rate" field
151 			s = MediaString::forVideoFieldRate(format.u.raw_video.field_rate,
152 											   format.u.raw_video.interlace);
153 			addField("Field Rate", s);
154 			// add the "Orientation" field
155 			s = MediaString::forVideoOrientation(format.u.raw_video.orientation);
156 			addField("Orientation", s);
157 			// add the "Aspect Ratio" field
158 			s = MediaString::forVideoAspectRatio(format.u.raw_video.pixel_width_aspect,
159 												 format.u.raw_video.pixel_height_aspect);
160 			addField("Aspect Ratio", s);
161 			// add the "Active Lines" field
162 			s = MediaString::forVideoActiveLines(format.u.raw_video.first_active,
163 												 format.u.raw_video.last_active);
164 			addField("Active Lines", s);
165 			// add the "Offset" field
166 			s = MediaString::forVideoOffset(format.u.raw_video.display.pixel_offset,
167 											format.u.raw_video.display.line_offset);
168 			addField("Offset", s);
169 			break;
170 		}
171 		case B_MEDIA_ENCODED_AUDIO: {
172 			// adjust view properties
173 			setSideBarWidth(be_plain_font->StringWidth(" Frame Size ") + 2 * InfoView::M_H_MARGIN);
174 			BString s;
175 			// add the "Bit Rate" field
176 			s = MediaString::forAudioBitRate(format.u.encoded_audio.bit_rate);
177 			addField("Bit Rate", s);
178 			// add the "Frame Size" field
179 			s = MediaString::forAudioFrameSize(format.u.encoded_audio.frame_size);
180 			addField("Frame Size", s);
181 			break;
182 		}
183 		case B_MEDIA_ENCODED_VIDEO: {
184 			// adjust view properties
185 			setSideBarWidth(be_plain_font->StringWidth(" Frame Size ") + 2 * InfoView::M_H_MARGIN);
186 			BString s;
187 			// add the "Bit Rate" field
188 			s = MediaString::forVideoBitRate(format.u.encoded_video.avg_bit_rate,
189 											 format.u.encoded_video.max_bit_rate);
190 			addField("Bit Rate", s);
191 			// add the "Frame Size" field
192 			s = MediaString::forVideoFrameSize(format.u.encoded_video.frame_size);
193 			addField("Frame Size", s);
194 			// add the "History" field
195 			s = MediaString::forVideoHistory(format.u.encoded_video.forward_history,
196 											 format.u.encoded_video.backward_history);
197 			addField("History", s);
198 			break;
199 		}
200 		case B_MEDIA_MULTISTREAM: {
201 			// adjust view properties
202 			setSideBarWidth(be_plain_font->StringWidth(" Chunk Size ") + 2 * InfoView::M_H_MARGIN);
203 			BString s;
204 			// add the "Format" field
205 			s = MediaString::forMultistreamFormat(format.u.multistream.format);
206 			addField("Format", s);
207 			// add the "Bit Rate" field
208 			s = MediaString::forMultistreamBitRate(format.u.multistream.avg_bit_rate,
209 												   format.u.multistream.max_bit_rate);
210 			addField("Bit Rate", s);
211 			// add the "Chunk Size" field
212 			s = MediaString::forMultistreamChunkSize(format.u.multistream.avg_chunk_size,
213 													 format.u.multistream.max_chunk_size);
214 			addField("Chunk Size", s);
215 			// add the "Flags" field
216 			s = MediaString::forMultistreamFlags(format.u.multistream.flags);
217 			addField("Flags", s);
218 			break;
219 		}
220 		default: {
221 			// add no fields
222 		}
223 	}
224 }
225 
226 // -------------------------------------------------------- //
227 // *** BView implementation (public)
228 // -------------------------------------------------------- //
229 
230 void ConnectionInfoView::DetachedFromWindow() {
231 	D_METHOD(("ConnectionInfoView::DetachedFromWindow()\n"));
232 
233 	InfoWindowManager *manager = InfoWindowManager::Instance();
234 	if (manager) {
235 		BMessage message(InfoWindowManager::M_CONNECTION_WINDOW_CLOSED);
236 		message.AddInt32("source_port", m_source.port);
237 		message.AddInt32("source_id", m_source.id);
238 		message.AddInt32("destination_port", m_destination.port);
239 		message.AddInt32("destination_id", m_destination.id);
240 		manager->PostMessage(&message);
241 	}
242 }
243 
244 // END -- ConnectionInfoView.cpp --
245