annotate audacious/softvolume.c @ 60:1771f253e1b2 trunk

[svn] Updated japanese translation, thanks to dai.
author nenolod
date Fri, 28 Oct 2005 21:36:53 -0700
parents cb178e5ad177
children 37882ab04091
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1 /* XMMS - Software volume managment.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
2 * Copyright (C) 2001-2003 Matthieu Sozeau
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
3 * Original implementation from a patch by Tomas Simonaitis <haden@homelan.lt>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
4 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8 * (at your option) any later version.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
9 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
13 * GNU General Public License for more details.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
14 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
18 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
19
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
20 #include <libaudacious/configdb.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
21 #include "softvolume.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26 * soft_volume_load
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28 * TODO: make argument order consistent with soft_volume_save()
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
31
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
32 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
33 soft_volume_load(const gchar * section, SoftVolumeConfig * c)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
34 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
35 ConfigDb *db;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
36
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
37 g_return_if_fail(c != NULL);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
38
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 c->enabled = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40 c->volume_left = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 c->volume_right = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43 db = bmp_cfg_db_open();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
44
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
45 bmp_cfg_db_get_bool(db, section, "softvolume_enable", &c->enabled);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
46 bmp_cfg_db_get_int(db, section, "softvolume_left", &c->volume_left);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
47 bmp_cfg_db_get_int(db, section, "softvolume_right", &c->volume_right);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
48
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
49 bmp_cfg_db_close(db);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
50 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
51
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
52
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 * soft_volume_save
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
57 * TODO: make argument order consistent with soft_volume_load()
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
58 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
59 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
60
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
61 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
62 soft_volume_save(SoftVolumeConfig * c, const gchar * section)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
63 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64 ConfigDb *db;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66 g_return_if_fail(c != NULL);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 db = bmp_cfg_db_open();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
70 bmp_cfg_db_set_bool(db, section, "softvolume_enable", c->enabled);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
71 bmp_cfg_db_set_int(db, section, "softvolume_left", c->volume_left);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
72 bmp_cfg_db_set_int(db, section, "softvolume_right", c->volume_right);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
73
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
74 bmp_cfg_db_close(db);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
75 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
76
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
80 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81 * soft_volume_get
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 soft_volume_get(SoftVolumeConfig * c, gint * l, gint * r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
88 if (c == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
89 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
90
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
91 *l = c->volume_left;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
92 *r = c->volume_right;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
93 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99 * soft_volume_set
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
102
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
103 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
104 soft_volume_set(SoftVolumeConfig * c, gint l, gint r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
105 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
106 if (c == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
107 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 c->volume_left = l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 c->volume_right = r;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116 * effect_16bit
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 G_INLINE_FUNC void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 effect_16bit(gint max, gint min, guint length, gint16 * sdata,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 SoftVolumeConfig * c)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124 gint i, v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 for (i = 0; i < (length >> 2); ++i) { /* ie. length/4 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127 v = (gint) ((*sdata * c->volume_left) / 100);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 *(sdata++) = (gint16) CLAMP(v, min, max);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 v = (gint) ((*sdata * c->volume_right) / 100);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131 *(sdata++) = (gint16) CLAMP(v, min, max);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
135
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
136 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
137 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
138 * effect_8bit
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
139 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
140 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
141
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
142 G_INLINE_FUNC void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
143 effect_8bit(gint max, gint min, guint length, gint8 * sdata,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
144 SoftVolumeConfig * c)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
145 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
146 gint i, v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
147
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
148 for (i = 0; i < (length >> 1); ++i) { /* ie. length/2 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
149 v = (gint) ((*sdata * c->volume_left) / 100);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
150 *(sdata++) = (gint8) CLAMP(v, min, max);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
151
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
152 v = (gint) ((*sdata * c->volume_right) / 100);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
153 *(sdata++) = (gint8) CLAMP(v, min, max);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
154 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
155 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
156
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
157
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
158 /**************************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
159 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
160 * soft_volume_effect
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
161 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
162 **************************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
163
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
164 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
165 soft_volume_effect(SoftVolumeConfig * c, gpointer data, AFormat format,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
166 gint length)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
167 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
168 if (!c)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
169 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
170
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
171 if (c->volume_right == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
172 c->volume_right = c->volume_left;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
173
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
174 switch (format) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
175 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
176 case FMT_S16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
177 case FMT_U16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
178 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
179
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
180 case FMT_U16_NE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
181 case FMT_U16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
182 effect_16bit(65535, 0, length, data, c);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
183 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
184
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
185 case FMT_S16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
186 case FMT_S16_NE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
187 effect_16bit(32767, -32768, length, data, c);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
188 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
189 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
190 case FMT_S16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
191 case FMT_U16_BE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
192 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
193
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
194 case FMT_U16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
195 case FMT_U16_NE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
196 effect_16bit(65535, 0, length, data, c);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
197 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
198
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
199 case FMT_S16_LE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
200 case FMT_S16_NE:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
201 effect_16bit(32767, -32768, length, data, c);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
202 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
203 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
204
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
205 case FMT_U8:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
206 effect_8bit(255, 0, length, data, c);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
207 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
208
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
209 case FMT_S8:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
210 effect_8bit(127, -128, length, data, c);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
211 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
212 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
213 }