Страница 1 из 1

Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 15:36:21
phoenix707
Очень нужна помощь в одном вопросе по Delphi. Если кто шарит в нем, откликнитесь.

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 15:48:29
ploop
Слушаю

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 15:58:07
phoenix707
В общем мне необходимо считать стерео сигнал с микрофона и обрабатывать каждый канал независимо друг от друга в параллельных процессах. Как моно сигнал считывать и обрабатывать я знаю, вот кусок кода для моно сигнала:

Код: Выделить всё

procedure TForm1.BitBtn1Click(Sender: TObject);
var
header: TWaveFormatEx;
BufLen: word;
buf: pointer;
begin
z:= StrToInt(Edit1.Text);
BufSize := 400; { Размер буфера }
with header do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1; { количество каналов }
nSamplesPerSec := 44100; { частота }
wBitsPerSample := 16; { 8 / 16 бит }
nBlockAlign := nChannels * (wBitsPerSample div 8);
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),
Form1.Handle, 0, CALLBACK_WINDOW);
BufLen := header.nBlockAlign * BufSize;
hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);
Buf := GlobalLock(hBuf);
with BufHead do
begin
lpData := Buf;
dwBufferLength := BufLen;
dwFlags := WHDR_BEGINLOOP;
end;
WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead));
WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));
GetMem(p, BufSize * sizeof(TPoint));
stop := true;
WaveInStart(WaveIn);
end;
Если я поставлю nChannels := 2, то я так понял стересигнал будет микшироваться, а мне нужно отдельно каждый сигнал обрабатывать в параллельных процессах. Как это сделать?

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 16:11:02
ploop
а мне нужно отдельно каждый сигнал обрабатывать в параллельных процессах. Как это сделать?
Ну, во первых, я не знаю, что за классы используются в обработке.
Если в коде нет конструкторов, значит это компоненты, правильно?

Чтобы запустить обработку в параллельных процессах, нужно запустить два экземпляра приложения, либо использовать API винды.
Вам же, наверное, надо сделать обработку в двух параллельных потоках внутри одного процесса. Так?

Если так, то назревает вопрос: представляете ли вы, как реализуются многопоточные приложения? В данном случае, возможно будет проблема при доступе к ресурсам. Надо разбираться конкретней, что это за объекты и как они работают.

Уже давно писал статью для начинающих по работе с потоками. Если интересно - вот http://delphikingdom.com/asp/viewitem.a ... logid=1370

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 16:27:52
phoenix707
Вот начало программы:

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, MMSystem, StdCtrls, ExtCtrls, jpeg, Grids, Buttons;

type
  TData16 = array [0..127] of smallint;
  PData16 = ^TData16;
  TPointArr = array [0..127] of TPoint;
  PPointArr = ^TPointArr;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Image1: TImage;
    Label2: TLabel;
    StringGrid1: TStringGrid;
    Image2: TImage;
    Label5: TLabel;
    Edit5: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    Image3: TImage;
    Image4: TImage;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
  private
    { Private declarations }
    function GetExcelFileName: String;
  public
    { Public declarations }
    procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  ComObj;

  const
  EXCEL_FILE_EXT = '.xls';


var
  WaveIn: hWaveIn;
  hBuf: THandle;
  BufHead: TWaveHdr;
  bufsize: integer;
  p: PPointArr;
  stop: boolean = false;
  z: integer;
Дальше идут процедуры.
Да, можно и 2 экземпляра запускать, как угодно, мне главное, чтоб работало. Как вот сделать так, чтобы в одном экземпляре обрабатывался только правый канал, а в другом - только левый. Вот это главное.

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 16:38:20
ploop
Уже вижу модуль MMSystem. Нет, я с ним не работал, надо разбираться.
Лучше вам обратиться на тематический форум, т.к. это не общий вопрос "по Delphi", а конкретно по работе с данным модулем.

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 16:49:46
phoenix707
ploop писал(а):Уже вижу модуль MMSystem. Нет, я с ним не работал, надо разбираться.
Лучше вам обратиться на тематический форум, т.к. это не общий вопрос "по Delphi", а конкретно по работе с данным модулем.
Ясно, а может можно как-нибудь по-другому составить алгоритм? Мне просто нужно через определенные промежутки времени брать значения амплитуд с сигнала от микрофона с обоих каналов.

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 16:55:04
ploop
Если только еще кто подскажет, я тут пас...

Re: Есть программисты на Delphi?

Добавлено: Ср мар 16, 2011 18:45:06
Rinon Ninqueon
Можно DirectX заюзать
модули в инэте есть