Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

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

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

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

function CreateNewWave(NewFileName: string): Boolean;
 
var
  DeviceID: 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;
 
begin
  MediaPlayer.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;
 
type
  TNickMediaPlayer = 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;
begin
  RegisterComponents('Samples', [TNickMediaPlayer]);
end;
 
function TNickMediaPlayer.DeleteWaveChunk(aFrom, aTo: LongInt): Longint;
var
  DeleteParms: TMCI_WAVE_DELETE_PARMS;
  Flags: LongInt;
begin
  Flags := 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

Взято из Советов по Delphi от Валентина Озерова

Сборник Kuliba