Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > работа со звуковухой


Автор: VAVII 7.1.2006, 16:02
Все так или иначе ставили себе такай продукт как WinAmp!
Многие видели в главном его окне "прыгающие полоски" или "осцилограмму"!
Никто не задавался вопросом как используя стандартные устройства Windows, Mixer, WaveOut и тд, можно сделать что-то подобное в альтернативном окошке?
Если у кого есть какие мысли, делитесь!

Автор: welt 7.1.2006, 20:17
смотри http://forum.vingrad.ru/index.php?showtopic=71799

Автор: VAVII 7.1.2006, 21:25
очень интересно! но тема в другом!

На выход звуковой карточки подается звук, скажем так, мне нужна осцилограмма выхода звуковухи.
Помогите... smile

Автор: welt 7.1.2006, 23:07
VAVII Поясни что такое выход звуковухи?
Что ты делаешь? Откуда подается звук, и т.д. ???

Автор: welt 8.1.2006, 03:26
Для изменения громкости умножай значения сэмплов на нужную тебе величину. 
Короче, можно просматривать осцилограмму не только с микрофона.
Можно в свойствах записи выбрать Wave Out или Mix Mono Out
или Line in. И тогда выводить или с колонок от копма (подключены к компу),
или же например с внешнего устройства.
Я набрал ее на Делфи. 
Если не получится, пиши, пришлю исходник...
Так... 
не нашел ссылки, поэтому вложил. 

Автор: VAVII 8.1.2006, 10:11
Все ништяк! Работает как надо! Большое спасибо!!

.::VaV::.

Автор: SAVANE 24.10.2006, 15:36
Я с кодом не разобрался, что в верхней ссілке, пришли если есть екзешник плиз. А во второй проге работает как часы, а можно ли там сделать так чтоб сигнал не с микрофона, а тот сигнал который посылает моя прога на звуковую.

Автор: Alexeis 24.10.2006, 15:49
Цитата(SAVANE @  24.10.2006,  15:36 Найти цитируемый пост)
Я с кодом не разобрался, что в верхней ссілке, пришли если есть екзешник плиз.


Посмотрите на срок давности темы. Она же от 8.1.2006. Продолжать ее обсуждение можно, но ждать, что автор вскоре появится и поможет - нет. 

Цитата(SAVANE @  24.10.2006,  15:36 Найти цитируемый пост)
а можно ли там сделать так чтоб сигнал не с микрофона

Я думаю, что если брать с Mixera  то это будет самое то, что надо.

Автор: SAVANE 25.10.2006, 10:04
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Forms,
  Dialogs, MMSystem;

type
  TWavArrayBuf = array[0..1023]of byte;
  PWavArrayBuf = ^TWavArrayBuf;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    WaveFormat: TWaveFormatEx;
    WaveIn: PHWaveIn;
    procedure WndProc(var Msg: TMessage); override;
    function InitWaveIn: Boolean;
    procedure CloseWaveIn;
  end;

var
  Form1: TForm1;

implementation

uses Math;

{$R *.dfm}

function TForm1.InitWavein: Boolean;
var
  I, Err: Integer;
  WaveHdr: PWaveHdr;
  WavBuff: PWavArrayBuf;

  procedure FreeData;
  begin
    if WavBuff <> nil then Dispose(WavBuff);
    if WaveHdr <> nil then Dispose(WaveHdr);
    if WaveIn <> nil then Dispose(WaveIn);
  end;

begin
  Result := False;
  WaveFormat.wFormatTag := WAVE_FORMAT_PCM;
  WaveFormat.nChannels := 1; 
  WaveFormat.nSamplesPerSec := 44100;
  WaveFormat.nAvgBytesPerSec := 44100;
  WaveFormat.nBlockAlign := 4;
  WaveFormat.wBitsPerSample := 8;
  WaveIn := New(PHWaveIn);
  Err := WaveInOpen(WaveIn, 0, @WaveFormat, Handle, 0, CALLBACK_WINDOW);
  if Err <> 0 then Exit;
  for i:=1 to 8 do
  begin
    WavBuff := New(PWavArrayBuf);
    WaveHdr := New(PWaveHdr);
    with WaveHdr^ do
    begin
      lpData := Pointer(WavBuff);
      dwBufferLength := SizeOf(WavBuff);
      dwBytesRecorded := 0;
      dwUser := 0;
      dwFlags := 0;
      dwLoops := 0;
    end;
    Err := WaveInPrepareHeader(WaveIn^, WaveHdr, SizeOf(TWaveHdr));
    if Err <> 0 then
    begin
      FreeData;
      Exit;
    end;
    Err := WaveInAddBuffer(WaveIn^, WaveHdr, Sizeof(TWaveHdr));
    if Err <> 0 then
    begin
      FreeData;
      Exit;
    end;
  end;
  Err := WaveInStart(WaveIn^);
  if Err <> 0 then
  begin
    FreeData;
    Exit;
  end;
  Result := True;
end;

Procedure Tform1.WndProc(var Msg: TMessage);
var
  Hdr: PWaveHdr;
  I: Integer;
  R: Real;
begin
  inherited;
  case Msg.Msg of
    MM_WIM_DATA:
    begin
      Hdr := PWaveHdr(Msg.LParam);
      if Hdr^.dwBytesRecorded = 0 then Exit;
      R := IfThen(Hdr^.dwBytesRecorded > 0,
        ClientWidth / Hdr^.dwBytesRecorded, 0);
      PatBlt(Canvas.Handle, 0, 0, ClientWidth,  ClientHeight, PATCOPY);
      Canvas.Pen.Color:=clRed;
      Canvas.MoveTo(0, 127);
      Canvas.LineTo(ClientWidth, 127);
      Canvas.Pen.Color := clMaroon;
      for I := 1 to 12 do
      begin
        Canvas.MoveTo(Round(R * (I * 100)), 0);
        Canvas.LineTo(Round(R * (I * 100)), 255);
      end;
      Canvas.Pen.Color:=clLime;
      Canvas.MoveTo(0, PWavArrayBuf(Hdr.lpData)^[0]);
      for I := 0 to Hdr^.dwBytesRecorded - 1 do
        Canvas.LineTo(Round(R * I), PWavArrayBuf(Hdr.lpData)^[I]);

      WaveInUnprepareHeader(WaveIn^, Hdr, Sizeof(TWaveHdr));
      Dispose(hdr.lpData);
      DisPose(hdr);

      Hdr := New(PWaveHdr);
      Hdr^.lpData := Pointer(New(PWavArrayBuf));
      Hdr^.dwBufferLength := 1024;
      Hdr^.dwBytesRecorded := 0;
      Hdr^.dwUser := 0;
      Hdr^.dwFlags := 0;
      Hdr^.dwLoops := 0;

      WaveInPrepareHeader(WaveIn^, Hdr, Sizeof(TWaveHdr));
      WaveInAddBuffer(WaveIn^, Hdr, Sizeof(TWaveHdr));
    end;
  end;
end;

procedure TForm1.CloseWaveIn;
begin
  WaveInStop(WaveIn^);
  if WaveIn <> nil then
  begin
    WaveInReset(WaveIn^);
    WaveInClose(WaveIn^);
  end;
  Dispose(WaveIn);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  Height := 282;
  Width := 1000;
  Color := clBlack;
  if not InitWaveIn then ShowMessage(SysErrorMessage(GetLastError));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseWaveIn;
end;

end.


Подскажите плиз где здесь прописывается, что берется сигнал именно с микрофона а не с любого другого выхода!  smile 

Автор: Alexeis 25.10.2006, 10:59
В функции function TForm1.InitWavein: Boolean;
идет вызов 
Err := WaveInOpen(WaveIn, 0, @WaveFormat, Handle, 0, CALLBACK_WINDOW);
(56-я строка)
Второй параметр uDeviceID - идентификатор устройства для получения сигнала

Цитата

uDeviceID 
  Identifier of the waveform-audio input device to open. It can be either a device identifier or a handle of an   open waveform-audio input device. You can use the following flag instead of a device identifier. 


Функция waveInGetNumDevs - возвращает число устройств для получения звука (все ID от 0 до возвращаемого значения могут использоваться как устройства для получения аудио сигнала)

Добавлено @ 11:03 
Чтобы узнать характеристики кождого из устройств надо вызвать функцию
waveInGetDevCaps
Код

MMRESULT waveInGetDevCaps(
  UINT_PTR     uDeviceID, 
  LPWAVEINCAPS pwic,      
  UINT         cbwic      
);

И передать ей допустимый ID. Структура LPWAVEINCAPS pwic - даст необходимое описание устройства с указанным ID.

Добавлено @ 11:07 
Эту многую другую информацию можно легко найти в MSDN в разделе
"Waveform Audio"

Автор: SAVANE 25.10.2006, 16:32
Часно, никогда пока с этим не стыкался.
Где мона про это почитать, подскажи плиз, а то мне как то неудобно задавать тупые вопросы.

Автор: Alexeis 25.10.2006, 17:28
На русском языке я нашел такую "Н. Секунов. Обработка звука на PC"
Она есть и в электронном варианте (не помню где качал), но по мне в MSDN все строго и четко описано. По крайней мере этот раздел.

Автор: Alexeis 26.10.2006, 09:46
Вот тут Секунов. 
http://rapidshare.de/files/22438957/PCSoundProcessing.rar.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)