Советы по Delphi

       

Создание пустого wav-файла


Как мне создать пустой wav-файл? Это просто пустой двоичный файл?

The TMediaPlayer может открыть звуковой файл, если он содержит, по крайней мере, один байт данных. Я обнаружил это, когда с помощью данного компонента пытался создать и открыть звуковой файл, содержащий только заголовок звукового файла. The TMediaplayer не захотел этого делать.

Нижеприведенный код создаст звуковой файл размером 1 байт. Конечно это криво, но это работает. Вам необходимо лишь добавить MMSYSTEM ко всем модулям, использующим данную функцию.

function CreateNewWave(NewFileName: String): Boolean;
varDeviceID: Word;Return: LongInt;MciOpen: TMCI_Open_Parms;MciRecord: TMCI_Record_Parms;MciPlay: TMCI_Play_Parms;MciSave: TMCI_SaveParms;MCIResult: LongInt;Flags: Word;TempFileName: array[0..255] of char;
beginMediaPlayer.Close;
StrPCopy(TempFileName, NewFileName);MciOpen.lpstrDeviceType := 'waveaudio';MciOpen.lpstrElementName := '';Flags := Mci_Open_Element or Mci_Open_Type;MCIResult := MciSendCommand(0, MCI_OPEN, Flags, LongInt(@MciOpen));
DeviceID := MciOpen.wDeviceId;
MciRecord.dwTo := 1;Flags := Mci_To or Mci_Wait;MCIResult := MciSendCommand(DeviceID, Mci_Record, Flags, LongInt(@MciRecord));
mciPlay.dwFrom := 0;Flags := Mci_From or Mci_Wait;MciSendCommand(DeviceId, Mci_Play, Flags, LongInt(@MciPlay));
mciSave.lpfileName := TempFilename;Flags := MCI_Save_File or Mci_Wait;MCIResult := MciSendCommand(DeviceID, MCI_Save, Flags, LongInt(@MciSave));
Result := MciSendCommand(DeviceID, Mci_Close, 0, LongInt(nil)) = 0;end;

Как мне очистить содержимое Wav-файла? Просто заново создать пустой?

Вот небольшой компонент, позволяющий стирать любую часть wave-файла:

unit Nickmp;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, MPlayer, MMSystem;
typeTNickMediaPlayer = class(TMediaPlayer)private{ Private declarations }protected{ Protected declarations }public{ Public declarations }function DeleteWaveChunk(aFrom, aTo: LongInt): Longint;published{ Published declarations }end;
procedure Register;
implementation
procedure Register
;beginRegisterComponents('Samples', [TNickMediaPlayer]);end;
function TNickMediaPlayer.DeleteWaveChunk(aFrom, aTo: LongInt): Longint;varDeleteParms: TMCI_WAVE_DELETE_PARMS;Flags: LongInt;beginFlags := 0;
if Wait then Flags := mci_Wait;if Notify then Flags := Flags or mci_Notify;DeleteParms.dwCallback := Handle;Flags := Flags or mci_From;DeleteParms.dwFrom := aFrom;Flags := Flags or mci_To;DeleteParms.dwTo := aTo;Result := mciSendCommand(DeviceID, mci_Delete, Flags, Longint(@DeleteParms));end;
end.

- Nick Hodges [000825]



Содержание раздела