Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KrutoiAlik
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 26
#1

Написать программу, формирующую по исходному WAV файлу новый WAV файл - C++

31.10.2015, 01:23. Просмотров 791. Ответов 7
Метки нет (Все метки)

Написать программу, формирующую по исходному WAV файлу новый WAV файл, со сглаженным вершинами перегруженных (клипированных) фрагментов. Программа компилируется, открывается окно с вводом файлов, но после ввода прерывается. Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#include <stdio.h>
#include <stdlib.h>
 
 
#define MAIN_H_INCLUDED
 
 
typedef struct
{
    unsigned int    bfType;
    unsigned long   bfSize;
    unsigned int    bfReserved1;
    unsigned int    bfReserved2;
    unsigned long   bfOffBits;
} BITMAinHEADER;
 
typedef struct
{
    unsigned int    biSize;
    int             biWidth;
    int             biHeight;
    unsigned short  biPlanes;
    unsigned short  biBitCount;
    unsigned int    biCompression;
    unsigned int    biSizeImage;
    int             biXPelsPerMeter;
    int             biYPelsPerMeter;
    unsigned int    biClrUsed;
    unsigned int    biClrImportant;
} BITMAPINFOHEADER;
 
typedef struct
{
    int   rgbBlue;
    int   rgbGreen;
    int   rgbRed;
    int   rgbReserved;
} RGBQUAD;
 
typedef struct
{
    float   y;
    float   cb;
    float   cr;
    int   rgbReserved;
} YCBCRQUAD;
 
 
static unsigned short read_u16(FILE *fp);
static unsigned int   read_u32(FILE *fp);
static int            read_s32(FILE *fp);
 
 
void main()
{
    int n =300;
 
    FILE * in;
    fopen_s(&in,"11.bmp", "rb");
 
 
    
    BITMAinHEADER header;
 
    header.bfType = read_u16(in);
    header.bfSize = read_u32(in);
    header.bfReserved1 = read_u16(in);
    header.bfReserved2 = read_u16(in);
    header.bfOffBits = read_u32(in);
 
    
    BITMAPINFOHEADER bmiHeader;
 
    bmiHeader.biSize = read_u32(in);
    bmiHeader.biWidth = read_s32(in);
    bmiHeader.biHeight = read_s32(in);
    bmiHeader.biPlanes = read_u16(in);
    bmiHeader.biBitCount = read_u16(in);
    bmiHeader.biCompression = read_u32(in);
    bmiHeader.biSizeImage = read_u32(in);
    bmiHeader.biXPelsPerMeter = read_s32(in);
    bmiHeader.biYPelsPerMeter = read_s32(in);
    bmiHeader.biClrUsed = read_u32(in);
    bmiHeader.biClrImportant = read_u32(in);
 
    int lastbytes = (4 - (bmiHeader.biWidth * 3) % 4) % 4;
 
    RGBQUAD **rgb = new RGBQUAD*[bmiHeader.biHeight];
    YCBCRQUAD **ycbcr = new YCBCRQUAD*[bmiHeader.biHeight];
    for (int j = 0; j < bmiHeader.biHeight; j++)
    {
        rgb[j] = new RGBQUAD[bmiHeader.biWidth];
        ycbcr[j] = new YCBCRQUAD[bmiHeader.biWidth];
    }
 
    int *lastbyte = new int[bmiHeader.biHeight*lastbytes];
 
    int index = 0;
    float max = 0*n*n;
    int coord_i = 0;
    int coord_j = 0;
 
    for (int i = 0; i < bmiHeader.biHeight; i++)
    {
        for (int j = 0; j < bmiHeader.biWidth; j++)
        {
            int t = getc(in);
            rgb[i][j].rgbBlue = t;
            t = getc(in);
            rgb[i][j].rgbGreen = t;
            t = getc(in);
            rgb[i][j].rgbRed = t;
 
            ycbcr[i][j].y = 0.299*(float)rgb[i][j].rgbRed + 0.587*(float)rgb[i][j].rgbGreen + 0.114*(float)rgb[i][j].rgbBlue;
            ycbcr[i][j].cb = -0.1687*(float)rgb[i][j].rgbRed - 0.3313*(float)rgb[i][j].rgbGreen + 0.5  *(float)rgb[i][j].rgbBlue + 128;
            ycbcr[i][j].cr = 0.5  *(float)rgb[i][j].rgbRed - 0.4187*(float)rgb[i][j].rgbGreen - 0.0813*(float)rgb[i][j].rgbBlue + 128;
        }
 
    // ïîñëåäГ*ГЁГ© ГЎГ*éò Гў ñòðîêå
    for (int j = 0; j < lastbytes; j++)
    {
        lastbyte[index] = getc(in);
        index++;
    }
 
    }
    
    
    for (int i = 0; i < (bmiHeader.biHeight - n); i++)
    {
        for (int j = 0; j < (bmiHeader.biWidth - n); j++)
        {
            float tmpsum = 0;
            for (int a = 0; a<n; a++)
            {
                for (int b = 0; b<n; b++)
                {
                    tmpsum = tmpsum + ycbcr[i + n - a][j + n - b].y;
                }
            }
            if (tmpsum>max)
            {
                max = tmpsum;
                coord_i = i;
                coord_j = j;
            }
 
        }
    }
 
    FILE * out;
    fopen_s(&out,"12.bmp", "wb");
    char c = 'a';
 
 
     
    lastbytes = (4 - (n * 3) % 4) % 4;
    int size = 54 + n*n + n*lastbytes;
    fwrite(&header.bfType, 2, 1, out);
    fwrite(&size, 4, 1, out);
    fwrite(&header.bfReserved1, 2, 1, out);
    fwrite(&header.bfReserved2, 2, 1, out);
    fwrite(&header.bfOffBits, 4, 1, out);
 
        
 
    fwrite(&bmiHeader.biSize, 4, 1, out);
    fwrite(&n, 4, 1, out);
    fwrite(&n, 4, 1, out);
    fwrite(&bmiHeader.biPlanes, 2, 1, out);
    fwrite(&bmiHeader.biBitCount, 2, 1, out);
    fwrite(&bmiHeader.biCompression, 4, 1, out);
    fwrite(&bmiHeader.biSizeImage, 4, 1, out);
    fwrite(&bmiHeader.biXPelsPerMeter, 4, 1, out);
    fwrite(&bmiHeader.biYPelsPerMeter, 4, 1, out);
    fwrite(&bmiHeader.biClrUsed, 4, 1, out);
    fwrite(&bmiHeader.biClrImportant, 4, 1, out);
 
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            fwrite(&rgb[coord_i + i][coord_j + j].rgbBlue, 1, 1, out);
            fwrite(&rgb[coord_i + i][coord_j + j].rgbGreen, 1, 1, out);
            fwrite(&rgb[coord_i + i][coord_j + j].rgbRed, 1, 1, out);
        }
 
        for (int i = 0; i < lastbytes; i++)
        {
            fwrite(&c, 1, 1, out);
        }
    }
 
    fclose(in);
    fclose(out);
}
 
 
static unsigned short read_u16(FILE *fp)
{
    unsigned char b0, b1;
 
    b0 = getc(fp);
    b1 = getc(fp);
 
    return ((b1 << 8) | b0);
}
 
 
static unsigned int read_u32(FILE *fp)
{
    unsigned char b0, b1, b2, b3;
 
    b0 = getc(fp);
    b1 = getc(fp);
    b2 = getc(fp);
    b3 = getc(fp);
 
    return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0);
}
 
 
static int read_s32(FILE *fp)
{
    unsigned char b0, b1, b2, b3;
 
    b0 = getc(fp);
    b1 = getc(fp);
    b2 = getc(fp);
    b3 = getc(fp);
 
    return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2015, 01:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Написать программу, формирующую по исходному WAV файлу новый WAV файл (C++):

Сохранить как .wav файл - C++
Подскажите пожалуйста как сохранить массив как wav файл, с полями структуры wav файла я разберусь , что писать в поле data ?

Наложение фильтров на WAV файл - C++
Добрый вечер! Согласно заданию, надо было реализовать функцию, объединяющую два wav файла в один, путем добавления отсчетов второго в конец...

Как побайтово считать Wav файл? - C++
Так, чтобы у я мог с ним работать, а потом опять выгрузить его как wav файл?

Запись и считывание информации в WAV-файл - C++
Всем добрый день. Занимаюсь такой проблемой: необходимо записать в звуковой файл и считать из него определенную последовательность. При...

Запись звука в массив и в файл wav - C++
Здравствуйте! Такой вопрос. Вот мне нужно записать звук по нажатию кнопки (пусть будет пробела) и занести записанное в массив по формату...

Наложение звукового эффекта на wav файл - C++
Надо на звуковой файл в формате waw, наложить звуковой эффект, может кто проконсультировать

7
nonedark2008
1011 / 751 / 175
Регистрация: 28.07.2012
Сообщений: 2,090
31.10.2015, 02:03 #2
Цитата Сообщение от KrutoiAlik Посмотреть сообщение
открывается окно с вводом файлов, но после ввода прерывается. Почему?
Прикол в том, что какой-либо "ввод файлов" в представленном коде отсутствует.

Добавлено через 7 минут
И да, какое отношение приведенный код имеет к WAV-файлам?
Просто нечто, скопированное из предыдущей темы.
0
KrutoiAlik
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 26
31.10.2015, 02:03  [ТС] #3
Не тот код =_=
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <stdio.h>
#include <locale>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
 
struct WAVHEADER
{
    char chunkId[4];
 
    
    unsigned long chunkSize;
 
    
    char format[4];
 
    
    char subchunk1Id[4];
 
    
    unsigned long subchunk1Size;
 
    
    unsigned short audioFormat;
 
    
    unsigned short numChannels;
 
    
    unsigned long sampleRate;
 
    unsigned long byteRate;
 
    
    unsigned short blockAlign;
 
    
    unsigned short bitsPerSample;
 
    
    char subchunk2Id[4];
 
    
    unsigned long subchunk2Size;
 
    
};
 
static unsigned short read_u16(FILE *fp);
 
int main()
{
    setlocale(LC_ALL, "Rus");
    FILE *file;
    char fname[255];
    cout << "ГЌГ*çâГ*Г*ГЁГҐ ГґГ*éëГ*: ";
    cin >> fname;
 
    fopen_s(&file, fname, "rb");
 
    if (file == NULL) 
    {
        exit(1);
    }
 
    WAVHEADER header;
 
    fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
 
    int tt = header.subchunk2Size / 2;
 
    FILE * file_out;
    char fname_out[255];
    cout << "\nГЌГ*çâГ*Г*ГЁГҐ èñõîäÿùåãî ГґГ*éëГ*: ";
    cin >> fname_out;
    fopen_s(&file_out, fname_out, "wb");
 
    
    fwrite(&header.chunkId, 4, 1, file_out);
    fwrite(&header.chunkSize, 4, 1, file_out);
    fwrite(&header.format, 4, 1, file_out);
    fwrite(&header.subchunk1Id, 4, 1, file_out);
    fwrite(&header.subchunk1Size, 4, 1, file_out);
    fwrite(&header.audioFormat, 2, 1, file_out);
    fwrite(&header.numChannels, 2, 1, file_out);
    fwrite(&header.sampleRate, 4, 1, file_out);
    fwrite(&header.byteRate, 4, 1, file_out);
    fwrite(&header.blockAlign, 2, 1, file_out);
    fwrite(&header.bitsPerSample, 2, 1, file_out);
    fwrite(&header.subchunk2Id, 4, 1, file_out);
    fwrite(&header.subchunk2Size, 4, 1, file_out);
 
    unsigned short *simple = new unsigned short[tt];
    unsigned short *data = new unsigned short[header.subchunk2Size];
    int q = 0;
     
    for (int i = 0; i < header.subchunk2Size; i++)
    {
        //cout << simple[i] << "\n";
        data[i] = getc(file);
    }
 
    for (int i = 0; i < tt; i++)
    {
        simple[i] = (data[q+1] << 8) | data[q];
 
        if (simple[i] > 20000 && simple[i] < 32768)
        {
            data[q] = 32;
            data[q+1] = 78;
        }
 
        if (simple[i] > 32767 && simple[i] < 45535)
        {
            data[q] = 223;
            data[q+1] = 177;                
        }
 
        //cout << simple[i] << "\n";
        fwrite(&data[q], 1, 1, file_out);
        fwrite(&data[q+1], 1, 1, file_out);
        q = q + 2;
    }
 
    fclose(file);
    fclose(file_out);
    delete[] simple;
    return 0;
}
0
KrutoiAlik
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 26
31.10.2015, 21:47  [ТС] #4
Dev C++ жалуется на fread_s b выдает ошибку [Error] 'fread_s' was not declared in this scope.
Если заменяю fread_s на fread? то выдает больше ошибок
[Error] invalid conversion from 'int' to 'FILE* {aka _iobuf*}' [-fpermissive]
[Error] too many arguments to function 'size_t fread(void*, size_t, size_t, FILE*)'
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//9. Написать программу, формирующую по исходному WAV файлу новый WAV файл,
//со сглаженными вершинами перегруженных(клипированных) фрагментов.
 
#include <stdio.h>
#include <locale>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
// Структура, описывающая заголовок WAV файла.
struct WAVHEADER
{
    // WAV-формат начинается с RIFF-заголовка:
    char chunkId[4];
 
    // Это размер файла - 8, то есть,
    // исключены поля chunkId и chunkSize.
    unsigned long chunkSize;
 
    // Содержит символы "WAVE"
    char format[4];
 
    // Содержит символы "fmt " - описывает формат звуковых данных
    char subchunk1Id[4];
 
    // 16 для формата PCM.
    // Это оставшийся размер подцепочки, начиная с этой позиции.
    unsigned long subchunk1Size;
 
    // Аудио формат. Для PCM = 1 (то есть, Линейное квантование).
    unsigned short audioFormat;
 
    // Количество каналов. Моно = 1, Стерео = 2 и т.д.
    unsigned short numChannels;
 
    // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
    unsigned long sampleRate;
 
    unsigned long byteRate;
 
    // Количество байт для одного сэмпла, включая все каналы.
    unsigned short blockAlign;
 
    // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
    unsigned short bitsPerSample;
 
    // Подцепочка "data" содержит аудио-данные и их размер.
 
    // Содержит символы "data"
    char subchunk2Id[4];
 
    // Количество байт в области данных.
    unsigned long subchunk2Size;
 
    // Далее следуют непосредственно Wav данные.
};
 
static unsigned short read_u16(FILE *fp);
 
int main()
{
    setlocale(LC_ALL, "Rus");
    FILE * file;
    char fname[255];
    cout << "Название файла: ";
    cin >> fname;
 
    file = fopen(fname, "rb");
 
    if (file == NULL) // ошибка чтения файла
    {
        exit(1);
    } else  {
    } cout << "Файл не удалось открыть!";
        
 
    WAVHEADER header;
//size_t fread( void * ptrvoid, size_t size, size_t count, FILE * filestream );
    fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
 
    int tt = header.subchunk2Size / 2;
 
    FILE * file_out;
    char fname_out[255];
    cout << "\nНазвание исходящего файла: ";
    cin >> fname_out;
    file_out = fopen( fname_out, "wb");
 
    //заголовок  файла
    fwrite(&header.chunkId, 4, 1, file_out);
    fwrite(&header.chunkSize, 4, 1, file_out);
    fwrite(&header.format, 4, 1, file_out);
    fwrite(&header.subchunk1Id, 4, 1, file_out);
    fwrite(&header.subchunk1Size, 4, 1, file_out);
    fwrite(&header.audioFormat, 2, 1, file_out);
    fwrite(&header.numChannels, 2, 1, file_out);
    fwrite(&header.sampleRate, 4, 1, file_out);
    fwrite(&header.byteRate, 4, 1, file_out);
    fwrite(&header.blockAlign, 2, 1, file_out);
    fwrite(&header.bitsPerSample, 2, 1, file_out);
    fwrite(&header.subchunk2Id, 4, 1, file_out);
    fwrite(&header.subchunk2Size, 4, 1, file_out);
 
    unsigned short *simple = new unsigned short[tt];
    unsigned short *data = new unsigned short[header.subchunk2Size];
    int q = 0;
     
    for (int i = 0; i < header.subchunk2Size; i++)
    {
        //cout << simple[i] << "\n";
        data[i] = getc(file);
    }
 
    for (int i = 0; i < tt; i++)
    {
        simple[i] = (data[q+1] << 8) | data[q];
 
        if (simple[i] > 20000 && simple[i] < 32768)
        {
            data[q] = 32;
            data[q+1] = 78;
        }
 
        if (simple[i] > 32767 && simple[i] < 45535)
        {
            data[q] = 223;
            data[q+1] = 177;                
        }
 
        //cout << simple[i] << "\n";
        fwrite(&data[q], 1, 1, file_out);
        fwrite(&data[q+1], 1, 1, file_out);
        q = q + 2;
    }
 
    fclose(file);
    fclose(file_out);
    delete[] simple;
    return 0;
}
Добавлено через 18 минут
С этим разобрался, но при вводе WAV файла выдает что файла нет. Что не так?
Добавил условие, что если файла нет программа закрывается.
0
nonedark2008
1011 / 751 / 175
Регистрация: 28.07.2012
Сообщений: 2,090
31.10.2015, 21:53 #5
Цитата Сообщение от KrutoiAlik Посмотреть сообщение
[Error] 'fread_s' was not declared in this scope.
Все функции с суффиксом _s - это фича от Майкрософт, так что в других компиляторах оно скорее всего работать не будет.
Цитата Сообщение от KrutoiAlik Посмотреть сообщение
Добавил условие, что если файла нет программа закрывается.
Это условие ты написал криво, перепроверь.
0
KrutoiAlik
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 26
31.10.2015, 21:55  [ТС] #6
У меня два компилятора: Dev C++ и MS VC++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int main()
{
    setlocale(LC_ALL, "Rus");
    FILE * file;
    char fname[255];
    cout << "Название файла: \n";
    cin >> fname;
 
    file = fopen(fname, "rb");
 
    if (file == NULL) // ошибка чтения файла
    {
        exit(1);
    } else  {
    } cout << "Файл не удалось открыть!\n";
    system("pause");
    return 0;
        
 
    WAVHEADER header;
//size_t fread( void * ptrvoid, size_t size, size_t count, FILE * filestream );
    fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
 
    int tt = header.subchunk2Size / 2;
 
    FILE * file_out;
    char fname_out[255];
    cout << "\nНазвание исходящего файла: \n";
    cin >> fname_out;
    file_out = fopen( fname_out, "wb");
    file = fopen(fname, "rb");
 
    if (file_out == NULL) // ошибка чтения файла
    {
        exit(1);
    } else  {
    } cout << "Файл не удалось открыть!\n";
    system("pause");
    return 0;
0
KrutoiAlik
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 26
01.11.2015, 23:04  [ТС] #7
И все же, почему у меня не находит файлы?
0
nonedark2008
1011 / 751 / 175
Регистрация: 28.07.2012
Сообщений: 2,090
01.11.2015, 23:27 #8
Цитата Сообщение от KrutoiAlik Посмотреть сообщение
И все же, почему у меня не находит файлы?
1. Либо ты неверно делаешь проверку открыт ли файл.
2. Файл находится не по тому пути, что ты указал.
3. Если ты уверен, что ошибка в чем-то другом, то попробуй вывести строку с ошибкой через strerror(errno).
0
01.11.2015, 23:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2015, 23:27
Привет! Вот еще темы с ответами:

Как написать простой конвертер из wav в mp3 - C++
Здравствуйте! Ребят, я в С++ прохо эрудирован, но мне нужено написать простенький конвертер из wav в mp3. Подскажите с чего начать и как...

Собрать Wav файл при попарном считывании - C++
Здравствуйте, на вход мне подаётся Raw файл попарно считываю с него по 16 бит, и пытаюсь сформировать из них стерео wav файл(16 бит в...

Написать функцию вычисляющую амплитудный спектр отсчетов звукового сигнала формата WAV - C++
Нужно написать функцию вычисляющую амплитудный спектр отсчетов звукового сигнала формата WAV. Посоветуйте с чего начать выполнение задания,...

Изменение каждого бита WAV-файла - файл "портится" - C++
Нагуглил здесь https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ что данные в формате wav начинаются с 44 байта. Из файла я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru