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

Флейм в чистом виде - все что угодно...
Но - в рамках закона :)
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Вс май 03, 2009 17:13:22

Сообщение phoenix707 »

Очень нужна помощь в одном вопросе по Delphi. Если кто шарит в нем, откликнитесь.
Everything will chance...
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Слушаю
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Вс май 03, 2009 17:13:22

Сообщение 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, то я так понял стересигнал будет микшироваться, а мне нужно отдельно каждый сигнал обрабатывать в параллельных процессах. Как это сделать?
Everything will chance...
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

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

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

Уже давно писал статью для начинающих по работе с потоками. Если интересно - вот http://delphikingdom.com/asp/viewitem.a ... logid=1370
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Вс май 03, 2009 17:13:22

Сообщение 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 экземпляра запускать, как угодно, мне главное, чтоб работало. Как вот сделать так, чтобы в одном экземпляре обрабатывался только правый канал, а в другом - только левый. Вот это главное.
Everything will chance...
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Уже вижу модуль MMSystem. Нет, я с ним не работал, надо разбираться.
Лучше вам обратиться на тематический форум, т.к. это не общий вопрос "по Delphi", а конкретно по работе с данным модулем.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Вс май 03, 2009 17:13:22

Сообщение phoenix707 »

ploop писал(а):Уже вижу модуль MMSystem. Нет, я с ним не работал, надо разбираться.
Лучше вам обратиться на тематический форум, т.к. это не общий вопрос "по Delphi", а конкретно по работе с данным модулем.
Ясно, а может можно как-нибудь по-другому составить алгоритм? Мне просто нужно через определенные промежутки времени брать значения амплитуд с сигнала от микрофона с обоих каналов.
Everything will chance...
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Если только еще кто подскажет, я тут пас...
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1562
Зарегистрирован: Ср июн 30, 2010 18:54:47
Откуда: NO14MU

Сообщение Rinon Ninqueon »

Можно DirectX заюзать
модули в инэте есть
Изображение
Изображение
Изображение
Сам себе Гилмор
Контактная информация:
Ответить

Вернуться в «МЯЯЯУ!»