Вверх ↑
Этот топик читают: Гость
Ответов: 1926
Рейтинг: 172
#1: 2010-01-24 20:37:40 ЛС | профиль | цитата
Вот новый компонент - для создания заголовка и для его чтения. Примеры прилагаются. Думаю, компонент полезный, и скоро в HiAsm можно будет сделать звуковой редактор наподобие Nero Wave Editor.
карма: 9
1
файлы: 1waveheader.rar [2.6KB] [443]
Голосовали:LainX
Ответов: 1161
Рейтинг: 160
#2: 2010-01-24 20:41:48 ЛС | профиль | цитата
Помню, тоже самое делал, только при помощи компонентов. Даже некий редактор звуков получился
карма: 0

0
Ответов: 1926
Рейтинг: 172
#3: 2010-01-24 21:11:30 ЛС | профиль | цитата
При помощи стандартных компонентов можно делать, конечно, но структура WAV стандартная, поэтому всё-таки хотелось упростить её создание.
------------ Дoбавленo в 22.26:
Сейчас попробовал в своей же схеме чтения заголовка(она в архиве) выбрать в программе несколько файлов - иногда выдаёт runtime error. Знающие люди, посмотрите, пожалуйта, что в коде компонента проводит к ошибке?
карма: 9
0
Разработчик
Ответов: 26115
Рейтинг: 2126
#4: 2010-01-24 23:01:40 ЛС | профиль | цитата
3042 писал(а):
что в коде компонента проводит к ошибке?

Скорее всего, вот это:


 FWavHeader := NewMemoryStream;

Ты создаешь экземпляр PStrem, а удалять его кто будет В таком случае, лучше всего добавить секции Constructor и Destructor


   public
constructor Create;
destructor Destroy; override;
end;

constructor THIWaveHeader.Create;
begin
inherited;
FWavHeader := NewMemoryStream;
end;

destructor THIWaveHeader.Destroy;
begin
FWavHeader.free;
inherited;
end;

//....

procedure THIWaveHeader._work_doCreate;
begin
FWavHeader.Size := 0; // вместо FWavHeader := NewMemoryStream;
//...
end;

карма: 22

0
Ответов: 1926
Рейтинг: 172
#5: 2010-01-25 06:54:39 ЛС | профиль | цитата
nesco, я говорил про код чтения, т.е. doGet. С doCreate всё в порядке.
карма: 9
0
Разработчик
Ответов: 26115
Рейтинг: 2126
#6: 2010-01-25 08:21:40 ЛС | профиль | цитата
3042 писал(а):
С doCreate всё в порядке

Не в порядке, я показал тебе неправильность построения динамического класса, которое приводит к утечке памяти, и не очень маленькой, учитывая размер стрима
------------ Дoбавленo в 08.36:
Вот смотри, мне это совсем непонятно


procedure THIWaveHeader._work_doGet;
begin
FWavHeader := ReadStream(_Data,_data_WavHeader,nil);
FWavHeader.Position := 0;
FWavHeader.Read(WaveHdr,SizeOf(WAVHDR));
if (FWavHeader=nil) or (WaveHdr.riff <> 'RIFF') then
begin
FWavHeader.Free;
exit;
end;
_hi_OnEvent(_event_onGet);
FWavHeader.Free;
end;

Первая ошибка -- нельзя уничтожать чужой стрим, ты его не получаешь сам, а получаешь только указатель на него, те, нельзя, ни в коем случае, делать FWavHeader.Free в этом методе. И для этго лучше оформить другую глобальную переменную класса, так как дальше ты ее зачем-то пересоздаешь, да еще и не очищая. Кстати, а как твоя структура WaveHdr попадет в wav-файл, судя по коду -- никак, так как ты ее пишишь в пустую память, вновь созданного стрима, а не в уже уничтоженный тобой поток самого файла. К тому же, как после уничтожения стрима, ты его читать собрался вот здесь


procedure THIWaveHeader._var_varWavHeader;
begin
dtNull(_Data);
if Assigned(FWavHeader) then dtStream(_Data,FWavHeader);
end;
в данном случае, varWavHeader будет дуступен только один раз -- сразу после doGet по onGet, и это не является правильным

Мое мнение, код очень сырой и требует кардинальной доработки


карма: 22

1
Голосовали:3042
Ответов: 1926
Рейтинг: 172
#7: 2010-01-25 08:39:22 ЛС | профиль | цитата
Хорошо, nesco, я исправил. Но проблему с doGet это не решило. Посмотри, в архиве project6.sha. Вот там проблема. Если выбрать один файл, после его чтения второй и затем третий, то выдаёт runtime err
карма: 9
0
Разработчик
Ответов: 26115
Рейтинг: 2126
#8: 2010-01-25 08:45:43 ЛС | профиль | цитата
3042, внимательно пересмотри еще раз код и алгоритм чтения, на работу надо бежать. Если будет время, то там и посмотрю
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#9: 2010-01-25 09:02:20 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-21 04:24:07
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#10: 2010-01-25 09:48:35 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-21 04:24:04
карма: 0

0
Ответов: 1926
Рейтинг: 172
#11: 2010-01-25 09:49:04 ЛС | профиль | цитата
вот. Выше это был я.
карма: 9
0
файлы: 1waveheader011.rar [2.7KB] [353]
Разработчик
Ответов: 26115
Рейтинг: 2126
#12: 2010-01-25 09:58:25 ЛС | профиль | цитата
38.10.204.89.access.ttkne писал(а):
Никак. Стуктура пишется в stream и выдаётся на varWavHeader. А дальше нужно записывать её через стандартные компоненты. В архиве есть схема

А че так, сложно, что ли, затолкать запись в компонент, и нафига такой стрим, как переменная, более актуально, использовать именно чтение параметров самого wav-файла Хотя, смотри сам, ты автор этого компонента
карма: 22

0
Ответов: 1926
Рейтинг: 172
#13: 2010-01-25 12:02:02 ЛС | профиль | цитата
nesco, этот компонент для работы именно с заголовком файла, а не с файлом. А если заталкивать туда запись, то это уже работа с файлом. Это упростит понимание структуры wav-файлов, особенно для новичков. А если запихивать и данные, и заголовок в один компонент, то наглядность уменьшится.
карма: 9
0
Разработчик
Ответов: 26115
Рейтинг: 2126
#14: 2010-01-25 12:09:10 ЛС | профиль | цитата
3042 писал(а):
А если запихивать и данные, и заголовок в один компонент

А я разве что-то говорил про данные, я имел в виду полную редакцию заголовка, включая, и чтение, и запись в файл
карма: 22

0
Ответов: 1926
Рейтинг: 172
#15: 2010-01-26 10:11:26 ЛС | профиль | цитата
nesco писал(а):
затолкать запись в компонент

Я подумал, что это про звуковые данные.

Пожалуй, ты прав, nesco. Я сделал в компоненте запись в файл и чтение из файла, и количество точек уменьшилось.

Вот. Интересно, в палитре такой компонент не помешает?
карма: 9
0
файлы: 1waveheader20.rar [2.7KB] [376]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)