Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Визуализация звука 
:(
    Опции темы
this
Дата 22.3.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Подскажите, пожалуйста как можно отобразить графически проигрываемый звук. Я читаю данные из файла с помощью mmio.. и waveout.. и проигрываю все это, но надо еще это отобразить на экране.
PM MAIL   Вверх
Alexeis
Дата 22.3.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Можно построить осцилограму, или показать спектр.
Идею предлагаю "украсть" у winampa


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
this
Дата 22.3.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Цитата(alexeis1 @ 22.3.2006, 14:25 Найти цитируемый пост)
Можно построить осцилограму, или показать спектр.

Вот и я о том же. Но как это сделать?

PM MAIL   Вверх
Alexeis
Дата 22.3.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Массив звуковых данных полагаю имеется.
Так просто рисуется график по имеющимся точкам в нужном масштабе.
Уточните проблему...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
this
Дата 22.3.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Цитата(alexeis1 @ 22.3.2006, 14:57)
Массив звуковых данных полагаю имеется.
Так просто рисуется график по имеющимся точкам в нужном масштабе.
Уточните проблему...

Массив звуковых данных есть. Проблема как отрисовывать параллельно воспроизведению.
PM MAIL   Вверх
Alexeis
Дата 23.3.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Значит нужно в реальном времени.
Можно посмотреть на процедуру воспроизведения звука.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
this
Дата 23.3.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Цитата(alexeis1 @ 23.3.2006, 10:09 Найти цитируемый пост)
Можно посмотреть на процедуру воспроизведения звука

Код

unit LineWavePlayer;

interface

uses TapiH, MMSystem, Windows, SysUtils, Forms, Messages, Classes, ExtCtrls,
      MainForm;

const
  ecFileNotFound           = -2;       {File not found}
  ecTapiWaveFail           = -13936;
  ecTapiWaveReadError      = -13940;
  ecTapiWaveDeviceInUse    = -13943;

  WaveInError   = 1;
  WaveOutError  = 2;
  MMioError     = 3;

  WaveOutBufferSeconds = 3;

type
  TPathCharArray=array[0..255]of char;
  TWaveState  = (wsIdle, wsPlaying, wsData);
  TWaveMessage = (waPlayOpen, waPlayDone, waPlayClose,
                 waRecordOpen, waDataReady, waRecordClose);

  {For returning TAPI VARSTRING data}
  PVarString = ^TVarString;
  TVarString = record
    case integer of
      1: (TotalSize     : DWORD;
          NeededSize    : DWORD;
          UsedSize      : DWORD;
          StringFormat  : DWORD;
          StringSize    : DWORD;
          StringOffset  : DWORD);
      2: (StringData    : array[0..1024] of Char);
  end;



  EWaveTapiException = class(Exception)
  private
    FErrorCode : Integer;
  public
    constructor Create(const EC : Integer; PassThru : Boolean);
    constructor CreateUnknown(const Msg : String; Dummy : Byte);
    class function MapCodeToStringID(const Code : Integer) : Word;
    property ErrorCode : Integer read FErrorCode write FErrorCode;
  end;

  TLineWavePlayer=class
  private
    LineHandle         : HLINE;            {Handle of the opened line device}
    CallHandle         : HCALL;            {Handle of the current call}

    FWaveState      : TWaveState;         {Current wave device state}
    FInterruptWave  : Boolean;
    FWaveFileName   : TFileName;          {Wave file name}
    FUseSoundCard   : Boolean;            {Play the sound through the sound card}
    FHandle         : HWnd;               {Window handle for hidden window}
    MmioOutHandle   : Integer;          {File handle for recording}
    WaveOutHandle   : HWaveOut;         {Handle of the wave out device}
    WaveOutHeader   : PWaveHdr;         {Wave header for playing}
    SamplesPerSecond   : Integer;          {Samples per sec for recording}
    BitsPerSample      : Byte;             {Bits per sample for recording}
    BytesToPlay        : LongInt;          {# of bytes in the wave file}
    TotalBytesToPlay   : Longint;
    BytesPlayed        : LongInt;          {# of bytes already played}
    BytesInBuffer      : LongInt;          {# of bytes in current buffer}
    WaveOutBuffers     : array of Pointer;          {Buffer for wave playing  }
    WaveOutBufferSizes : array of Integer;
    ActiveWaveOutBuffer: Byte;             {The active wave out buffer}
    VS                 : TVarString;       {Used to return Cid}
    TapiDevOpened      : Boolean;
    FDropTimer         : TTimer;
    procedure DropTimerEvent(Sender:TObject);
    
  public
    constructor Create(ALine:HLine; ACall:HCall; ADropDelay:Integer);
    destructor  Destroy; override;
    procedure PlayWaveFile(FileNames : TStringList);
    procedure StopWaveFile;
    function  GetWaveDeviceId(const Play : Boolean) : DWORD;
    procedure CheckWaveException(ErrorCode : Integer; Mode : Integer);
    procedure FreeWaveOutBuffer;
    procedure LoadWaveOutBuffer(Buf:Integer);
    procedure PlayWaveOutBuffer;
    procedure WndProc(var Message : TMessage);
   end;

implementation

  constructor TLineWavePlayer.Create(ALine:HLine; ACall:HCall; ADropDelay:Integer);
  begin
    inherited Create;
    {Create the TAPI name string list}

    {Private inits}
    LineHandle      := ALine;
    CallHandle      := ACall;

    {Property inits}
    FWaveState       := wsIdle;
    FInterruptWave   := True;
    FWaveState       := wsIdle;
    FUseSoundCard    := False;
    SamplesPerSecond := 8000;
    BitsPerSample    := 16;

    FHandle := AllocateHWnd(WndProc);

    FDropTimer:=TTimer.Create(nil);
    FDropTimer.Interval:=ADropDelay;
    FDropTimer.Enabled:=False;
    FDropTimer.OnTimer:=DropTimerEvent;

  end;

destructor TLineWavePlayer.Destroy;
begin
  StopWaveFile;

  FDropTimer.Free;
end;

procedure TLineWavePlayer.PlayWaveFile(FileNames : TStringList);
    { Play a wave file through the TAPI device or through the sound card. }
  var
    MmCkInfoParent   : TMMCkInfo;
    MmCkInfoSubchunk : TMMCkInfo;
    FormatSize       : DWORD;
    WaveFormat       : PWaveFormatEx;
    Res              : LongInt;
    WaveOutDevCaps   : TWaveOutCaps;
    DeviceId         : DWORD;
    Temp             : TPathCharArray;
    Flags            : LongInt;
    I:Integer;
  begin
   
    { If a wave file is playing then stop it. }
    if FWaveState = wsPlaying then
      if FInterruptWave then begin
        StopWaveFile;
        while (WaveOutHandle <> 0) do
          Application.ProcessMessages;
      end
      else
        Exit;

      if (WaveOutHeader <> nil) then
        FreeWaveOutBuffer;
    SetLength(WaveOutBuffers,FileNames.Count);
    SetLength(WaveOutBufferSizes,FileNames.Count);
    TotalBytesToPlay:=0;
    BytesPlayed := 0;
    for I:=0 to FileNames.Count-1 do begin
      FWaveFileName := FileNames[I];
      { Check for the existence of the wave file first. }
      if (not FileExists(FWaveFileName)) then
        raise EWaveTapiException.Create(ecFileNotFound, True);

      if FUseSoundCard then
        DeviceId := WAVE_MAPPER
      else
        DeviceId := GetWaveDeviceId(True);

      { Open the wave file }
      MmioOutHandle := mmioOpen(StrPCopy(Temp, FWaveFileName),
        nil, MMIO_READ or MMIO_ALLOCBUF);

      { Look for the 'WAVE' chunk to be sure it's a .WAV file.}
      MmCkInfoParent.fccType := mmioStringToFOURCC('WAVE', 0);

      Res := MmioDescend(MmioOutHandle,
        @MmCkInfoParent, nil, MMIO_FINDRIFF);
      CheckWaveException(Res, MMioError);

      { Locate the format chunk. }
      MmCkInfoSubchunk.ckid := mmioStringToFOURCC('fmt ', 0);

      Res := mmioDescend(MmioOutHandle, @MmCkinfoSubchunk, @MmCkinfoParent, MMIO_FINDCHUNK);
      CheckWaveException(Res, MMioError);

      { Get the size of the format chunk and allocate some memory for it. }
      FormatSize := MmCkinfoSubchunk.cksize;
      GetMem(WaveFormat, FormatSize);

      { Read the format chunk. }
      Res := mmioRead(MmioOutHandle, PChar(WaveFormat), FormatSize);
      if Res = -1 then
         raise EWaveTapiException.Create(ecTapiWaveReadError, True);

      { Make sure the TAPI wave out device supports the   }
      { wave file format. The WAVE_FORMAT_QUERY flag will }
      { query the device without actually opening it.     }
      waveOutGetDevCaps(deviceId,
        @WaveOutDevCaps, SizeOf(WaveOutDevCaps));
      Flags := WAVE_FORMAT_QUERY;
      if not FUseSoundCard then
       Flags := Flags or WAVE_MAPPED;
      Res := waveOutOpen(@WaveOutHandle,
        DeviceId, WaveFormat, 0, 0, Flags);
      CheckWaveException(Res, WaveOutError);

      { Find the data subchunk. }
      mmioAscend(MmioOutHandle, @MmCkinfoSubchunk, 0);
      MmCkinfoSubchunk.ckid := mmioStringToFOURCC('data', 0);
      Res := mmioDescend(MmioOutHandle, @MmCkinfoSubchunk, @MmCkinfoParent, MMIO_FINDCHUNK);
      CheckWaveException(Res, MMioError);

      { Get the size of the data. }
      BytesToPlay := MmCkinfoSubchunk.cksize;
      WaveOutBufferSizes[I] := BytesToPlay;
      TotalBytesToPlay:=TotalBytesToPlay+BytesToPlay;

      if not TapiDevOpened then begin
        { Open the TAPI wave out device. }
        Flags := CALLBACK_WINDOW;
        if not FUseSoundCard then
          Flags := Flags or WAVE_MAPPED;
        Res := waveOutOpen(@WaveOutHandle, Integer(DeviceId),
          WaveFormat, MakeLong(FHandle, 0), DWORD(Self), Flags);
        if Res=0 then
          TapiDevOpened:=True
        else begin
           if (Res = MMSYSERR_NOTENABLED) then begin
             FreeMem(WaveFormat, SizeOf(FormatSize));
             WaveOutHandle := 0;
             Exit;
           end
           else
             CheckWaveException(Res, WaveOutError);
        end;
      end;
      { Free the memory allocated for the format header. }
      FreeMem(WaveFormat, SizeOf(FormatSize));

      { Set up WaveOutHeader record. }
      GetMem(WaveOutHeader, SizeOf(TWaveHdr));
      WaveOutHeader^.dwFlags        := 0;
      WaveOutHeader^.dwLoops        := 0;
      WaveOutHeader^.dwUser         := 0;

      { Allocate memory for the data. This memory will be }
      { freed when the wave file finishes playing. }
      GetMem(WaveOutBuffers[I], WaveOutBufferSizes[I]);
      LoadWaveOutBuffer(I);
      mmioClose(mmioOutHandle, 0);
    end;

    ActiveWaveOutBuffer := 0;
    { Start playing. }
    PlayWaveOutBuffer;
    FWaveState := wsPlaying;
end;

  procedure TLineWavePlayer.StopWaveFile;
    { Stop the wave file from playing. }
  begin
    {if (FWaveState <> wsPlaying) then Exit;}
    if WaveOutHandle = 0 then exit;
    BytesPlayed := -1;
    waveOutReset(WaveOutHandle);
  end;

  function TLineWavePlayer.GetWaveDeviceId(const Play : Boolean) : DWORD;
    { Gets the device ID for the TAPI wave device. }
  var
    Res              : DWORD;
  begin
    Result := 0;
    FillChar(VS, SizeOf(TVarString), 0);
    VS.TotalSize := SizeOf(TVarString);
    if Play then
      // TAPI!!!
      Res := lineGetID(LineHandle, 0, CallHandle,
                   LINECALLSELECT_CALL,
                   @VS, 'wave/out')
    else
      Res := lineGetID(LineHandle, 0, CallHandle,
                   LINECALLSELECT_CALL,
                   @VS, 'wave/in');
    if Res <> 0 then
      raise EWaveTapiException.Create(ecTapiWaveFail, True)
    else with VS do
      Move(StringData[StringOffset], Result, SizeOf(DWORD));
  end;

  procedure TLineWavePlayer.CheckWaveException(ErrorCode : Integer;
                                                    Mode : Integer);
    { Checks to see if a wave or mmio exception was raised. }
  var
    ErrorText : array [0..MAXERRORLENGTH] of Char;
    ErrorString : string;
  begin
    if (ErrorCode = 0) then Exit;
    case Mode of
      WaveInError  :
        begin
          waveInGetErrorText(ErrorCode, ErrorText, SizeOf(ErrorText));
          ErrorString := StrPas(ErrorText);
        end;
      WaveOutError :
        begin
          waveOutGetErrorText(ErrorCode, ErrorText, SizeOf(ErrorText));
          ErrorString := StrPas(ErrorText);
        end;
      MMioError    :
        ErrorString := 'Error'; // My correction
    end;
    raise  EWaveTapiException.CreateUnknown(ErrorString, 0);
  end;

  procedure TLineWavePlayer.FreeWaveOutBuffer;
    { Free the memory for the wave out buffer and WaveOutHeader. }
  var I:Integer;
  begin
    WaveOutHandle := 0;
    if (WaveOutHeader <> nil) then begin
      { Free the memory for the wave out buffers. }
      WaveOutHeader^.lpData := nil;
      for I:=0 to Length(WaveOutBuffers)-1 do
       begin
        FreeMem(WaveOutBuffers[I], WaveOutBufferSizes[I]);
       end;
      { Free the memory for the wave header. }
      FreeMem(WaveOutHeader, SizeOf(TWaveHdr));
      WaveOutHeader := nil;
    end;
  end;

  procedure TLineWavePlayer.LoadWaveOutBuffer(Buf:Integer);
  var
    Res   : LongInt;
  begin
      { Read the waveform data into the idle buffer. }
        Res := mmioRead(MmioOutHandle,
          PChar(WaveOutBuffers[Buf]), WaveOutBufferSizes[Buf]);
      if Res = -1 then
         raise EWaveTapiException.Create(ecTapiWaveReadError, True);
  end;

  procedure TLineWavePlayer.PlayWaveOutBuffer;
  var
    Res   : LongInt;
  begin
    BytesInBuffer:=WaveOutBufferSizes[ActiveWaveOutBuffer];
    WaveOutHeader^.lpData := PChar(WaveOutBuffers[ActiveWaveOutBuffer]);
    WaveOutHeader^.dwBufferLength := BytesInBuffer;
    waveOutPrepareHeader(
      WaveOutHandle, WaveOutHeader, SizeOf(TWaveHdr));
    { Write the data to the wave out device. }
    Res := waveOutWrite(
      WaveOutHandle, WaveOutHeader, SizeOf(TWaveHdr));
    if (Res <> 0) then begin
      waveOutUnprepareHeader(
        WaveOutHandle, WaveOutHeader, SizeOf(TWaveHdr));
      FreeWaveOutBuffer;
      Exit;
    end;

    BytesPlayed := BytesPlayed + WaveOutBufferSizes[ActiveWaveOutBuffer];

    Inc(ActiveWaveOutBuffer);
    { If the entire file has been loaded then set BytesPlayed}
    { to -1 so we know we are on the last buffer.}
    if (BytesPlayed >= TotalBytesToPlay)or(ActiveWaveOutBuffer>Length(WaveOutBuffers)) then
      BytesPlayed := -1;
  end;

  procedure TLineWavePlayer.WndProc(var Message: TMessage);
    { WndProc to handle wave messages. }
  var
    header:PWaveHdr;
  begin
    case Message.Msg of
      MM_WOM_CLOSE :
        { The wave output device was closed. }
        begin
          FWaveState := wsIdle;
        end;
      MM_WOM_DONE :
        { Done playing a wave buffer. }
        begin
          with Message do begin
            header:=PWaveHdr(Message.LParam);
           // form1.Memo1.Lines.add(IntToStr(header^.dwBufferLength));
            //VizualizeBuffer(header^.lpData, header^.dwBufferLength, Form1.PaintBox1);
            { Unprepare the header. }
            waveOutUnprepareHeader(
              hWaveOut(wParam), WaveOutHeader, SizeOf(TWaveHdr));
            { All done? }
            if BytesPlayed = -1 then begin
              if WaveOutHandle <> 0 then begin
                waveOutClose(WaveOutHandle);
                TapiDevOpened:=False;
                FWaveState := wsIdle;
                FreeWaveOutBuffer;
                FDropTimer.Enabled:=True;
              end;
            { Not done, play another buffer. }
            end else
              begin
                PlayWaveOutBuffer;
              end;
          end;
        end;
    end;

  end;

  procedure TLineWavePlayer.DropTimerEvent(Sender:TObject);
  begin
    FDropTimer.Enabled:=False;
    lineDrop(CallHandle,nil,0);
  end;



  constructor EWaveTapiException.Create(const EC : Integer; PassThru : Boolean);
  begin
    FErrorCode := EC;
    inherited Create('ERROR!!!'); // MyCorrection
  end;

  constructor EWaveTapiException.CreateUnknown(const Msg : String; Dummy : Byte);
  begin
    ErrorCode := 0;

    inherited Create(Msg);
  end;

  class function EWaveTapiException.MapCodeToStringID(const Code : Integer) : Word;
  begin
    Result := Abs(Code);
  end;

PM MAIL   Вверх
Alexeis
Дата 23.3.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



WaveOutBufferSizes[ActiveWaveOutBuffer] определяет длину блока
время = длинна / частоту (вероятно 44,1кгц)

Значит в течении этого времени нужно визуализировать звук
блока данных
WaveOutBuffers[ActiveWaveOutBuffer]
Добавлено @ 13:55
Пусть у нас есть экран.
1) нужно выбрать частоту обнавления экрана от этого будет зависить сколько данных мы можем отобразить.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 23.3.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Даллее зная частоту экрана мы вычислим масштаб данных.
за 1 сек 44100 точек в n кадрах значит в одном кадре будут отображаться 44100 / n точек (это если без перекрытия с предыдущим и последующим кадрами) если перекрывать(т.е. отображать данные прошедших и будующих кадров тогда будет создавться илюзия движения),
то можно выбрать например 3 * 44100 / n или другое значение большее чем 44100 / n - поскольку это и будет сдвиг по данным от кадра до кадра.
Добавлено @ 14:11
Однако все это придется както синхронизировать с воспроизведением.
Необходимо узнать момент когда закончилось воспроизведение одного блока и началось воспроизведение другого.
Как это узнать я пока не знаю...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 23.3.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Лихо smile каждый сэмпл помещается в отдельный буффер и воспроизводится за один вызов функции, значит ни какого контроля за воспроизведением не будет и визуализацию надо будет делать независимой и синхранизировать можно будет только по началу концу и команде Stop
Похоже без дополнительного потока здесь ни как не обойтись.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
this
Дата 23.3.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Цитата(alexeis1 @ 23.3.2006, 14:29 Найти цитируемый пост)
каждый сэмпл помещается в отдельный буффер и воспроизводится за один вызов функции
- Где ты это увидел?

PM MAIL   Вверх
Alexeis
Дата 24.3.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Код

for I:=0 to FileNames.Count-1 do begin    
      FWaveFileName := FileNames[I];

по очереди выделяет имена файлов

Код

      MmioOutHandle := mmioOpen(StrPCopy(Temp, FWaveFileName),    
        nil, MMIO_READ or MMIO_ALLOCBUF);

Открывает файл

Код

      BytesToPlay := MmCkinfoSubchunk.cksize;    
      WaveOutBufferSizes[I] := BytesToPlay;    
      TotalBytesToPlay:=TotalBytesToPlay+BytesToPlay;

WaveOutBufferSizes[I] - указывается размер всего блока данных
Код

      GetMem(WaveOutBuffers[I], WaveOutBufferSizes[I]);    
      LoadWaveOutBuffer(I);


Записывает данные целиком в один буфер.

Код

procedure TLineWavePlayer.PlayWaveOutBuffer;    
  var    
    Res   : LongInt;    
  begin    
    BytesInBuffer:=WaveOutBufferSizes[ActiveWaveOutBuffer];    
    WaveOutHeader^.lpData := PChar(WaveOutBuffers[ActiveWaveOutBuffer]);    
    WaveOutHeader^.dwBufferLength := BytesInBuffer;    
    waveOutPrepareHeader(    //BytesInBuffer - размер всего блока!!!!!!!!
      WaveOutHandle, WaveOutHeader, SizeOf(TWaveHdr));    
    { Write the data to the wave out device. }    
    Res := waveOutWrite(    //здесь!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      WaveOutHandle, WaveOutHeader, SizeOf(TWaveHdr));


отправляет данные целиком

Это сообщение отредактировал(а) alexeis1 - 24.3.2006, 12:37


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
this
Дата 24.3.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Цитата(alexeis1 @ 24.3.2006, 10:19 Найти цитируемый пост)
WaveOutBufferSizes[I] - указывается размер всего сэмпла
А что по твоему такое сэмпл?

PM MAIL   Вверх
Alexeis
Дата 24.3.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



this, я ошибся хотел сказать всего блока данных(всех данных файла)
Кстати разве это не одно и тоже?
Если я не прав то что не верно в моей интерпретации?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
this
Дата 28.3.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 12.9.2005

Репутация: нет
Всего: 1



Так как все-таки реализовать отображение звука?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0967 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.