C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запись звука (waveInOpen), Как прочитать буфер записи?
Tinto
Отправлено: 23.05.2004, 09:34


Ученик-кочегар

Группа: Участник
Сообщений: 8



WaveHdr.lpData — указатель на буфер записи заполненный двоичными данными. Как прочитать этот буфер (блок памяти ), например в бинари файл, перед последующей командой — очистки буфера:
free(WaveHdr.lpData);
пробовал так:
char*Buffer = NULL;
memmove(Buffer,WaveHdr.lpData,n);
компилер ругается Access Violation address ....Help me!!! cool.gif
klen
Отправлено: 23.05.2004, 10:18


Машинист паровоза

Группа: Участник
Сообщений: 239



Ты память для буффера Buffer невыделил

CODE

// выделение памяти
char* Buffer = new char[n];
WaveHdr.lpData = new char[n];

..... какойто код (запись звука например) ..........

// копирование буфера (ТОЛЬКО НЕ ПОЙМУ НАКОЙ ХЕР МОЖЕТ ПОНАДОБИТСЯ  ДАННЫЕ ГОНЯТЬ ПО ПАМЯТИ ?????????? ЭТО НЕПРАВИЛЬНЫЙ АЛГОРИТМ, ПРАВИЛЬНЫЙ — СОЗДАТЬ НЕСКОЛЬКО БУФЕРОВ И РАБОТАТЬ НА НА НИХ БЕЗ КОПИРОВАНИЯ — выше скорость, меньше ресурсов )
memcpy(Buffer,WaveHdr.lpData,n);

...используешь Buffer....

delete Buffer;
delete WaveHdr.lpData;


Отредактировано klen — 23/05/2004, 11:21
Tinto
Отправлено: 23.05.2004, 10:40


Ученик-кочегар

Группа: Участник
Сообщений: 8



WaveHdr.lpData = (char*)malloc(BufferSize);//память выделена
.
.
.
Как здесь скопировать WaveHdr.lpData в файло?
.
.
.
free(WaveHdr.lpData);//память освобождена
klen
Отправлено: 23.05.2004, 12:13


Машинист паровоза

Группа: Участник
Сообщений: 239



тип файла то какой, если просто сырой формат(без заголовков) то можно так:

CODE

TFileStream* File = new TFileStream ("FileName" , fmCreate );

// если не сырой формат то здесь пишешь заголовки
...........................


File -> WriteBuffer ( WaveHdr.lpData , n );
delete File;

Tinto
Отправлено: 23.05.2004, 15:33


Ученик-кочегар

Группа: Участник
Сообщений: 8



Попробовал таким вот способом:
FILE*f=fopen("d:\Sound2.bin","wb");
fwrite(WaveHdr.lpData,WaveHdr.dwBufferLength,1000,f);
fclose(f);
Записывает 0 байтов. wink.gif
Tinto
Отправлено: 23.05.2004, 16:09


Ученик-кочегар

Группа: Участник
Сообщений: 8



А вот так получилось:
int Handle = FileOpen("d:\speclab\wave\Sound2.bin", fmOpenWrite);
FileWrite(Handle, WaveHdr.lpData, WaveHdr.dwBufferLength);
FileClose(Handle);
Не пойму в чем разница?
Tinto
Отправлено: 23.05.2004, 20:38


Ученик-кочегар

Группа: Участник
Сообщений: 8



Всем кому интересно, как я решил эту задачу (захват зука или запись аудиосигнала в бинарный файл) могут посмотреть готовую программу на форуме XPortal в разделе МультиМедиа. Всем спасибо за участие. biggrin.gif

Вернуться в Вопросы программирования в C++Builder