Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2012, 14:00   #1
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию Проблема с выводом звука

Ребят подскажите почему при выводе звука в конце идет шипение и как от него избавиться так чтоб длительность сигнала была равна заданной?
Вложения
Тип файла: rar WBeep.rar (6.9 Кб, 23 просмотров)
JekaDefer вне форума Ответить с цитированием
Старый 14.06.2012, 20:22   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Код не смотрел, но навскидку: если длина буфера больше последнего фрагмента звукового файла, обнулите остаток.
s-andriano вне форума Ответить с цитированием
Старый 15.06.2012, 07:57   #3
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Да в том то и суть что вроде бы ничего не больше.. посмотрите код плиз.. Шипение убрать можно уменьшив немного длину буфера для вывода
Код:
hdr[0].dwBufferLength := sizeof(Sample);
заменить на
Код:
hdr[0].dwBufferLength := sizeof(Sample)-3300;
, но интересно откуда это шипение вообще берется... Ведь у меня nSamplesPerSec=8000 и заполняются только эти 8000 и выводится тоже только массив из этих 8000.. по идее должно все работать.. я хз

Последний раз редактировалось JekaDefer; 15.06.2012 в 08:05.
JekaDefer вне форума Ответить с цитированием
Старый 19.06.2012, 23:15   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Замените
Код:
dwBufferLength := sizeof(Sample);
на
Код:
dwBufferLength := Length(Sample);
SizeOf() Выдает размер этого массива в байтах. То, сколько он занимает места в памяти.

Для наглядного сравнения
Код:
  Caption := Format('%u, %u', [SizeOf(Sample), Length(Sample)]);

Последний раз редактировалось kangreon; 19.06.2012 в 23:17.
kangreon вне форума Ответить с цитированием
Старый 20.06.2012, 00:11   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

я, как аффтар основной части кода, не согласен с такой заменой

Цитата:
dwBufferLength Length, in bytes, of the buffer.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 20.06.2012 в 00:14.
veniside вне форума Ответить с цитированием
Старый 20.06.2012, 02:48   #6
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Да, ошибся. =)

Попытка найти проблему 2:

Треск в конце файла возникает, скорее всего, из за освобождения массива.
Если в конце процедуры вставить обычный Sleep(...) или объявить
Код:
Sample: array[0..8000-1] of integer;	// full second
глобально, то воспроизводится нормально, однако иногда, в конце воспроизведения, приложение крашится.

PS Это не точный вариант решения проблемы, просто обстоятельство при котором нету треска.

Последний раз редактировалось kangreon; 20.06.2012 в 02:52.
kangreon вне форума Ответить с цитированием
Старый 02.07.2012, 20:44   #7
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

А есть варианты как сделать чтобы звук длился дольше 1 секунды без перерыва?
JekaDefer вне форума Ответить с цитированием
Старый 10.07.2012, 01:44   #8
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Кто нибудь может показать как изменить нижеследующий код так чтобы использовалось не hdr: array[0..2] а hdr: array[0..1] но при этом так же игралось 3 или хоть скоко раз?
код:
Код:
program
  GenWave;

{$APPTYPE CONSOLE}

uses
  SysUtils, MMSystem;

const
  sps	= 44100;	// samples per second
  freq1	= 1000;	 	// signal frequency (Hz)
  freq2	= 900;	 	// signal frequency (Hz)
  freq3	= 1200;	 	// signal frequency (Hz)
  time1	= 1000;		// time of signal (ms)
  time2	= 1000;		// time of signal (ms)
  time3	= 1000;		// time of signal (ms)
  Volume1 = 32767;
  Volume2 = 32767;
  Volume3 = 32767;

type
  int16 = smallint;

var
  second: array[0..2, 0..sps] of int16;	// full second
// --  --
procedure prepareSine();
var
  i, nSamples: Integer;
  angle, delta: double;
begin
  nSamples := sps * time1 div 1000;	// signal length in samples
  //
  angle := 0;
  delta := (freq1 / sps) * 2 * Pi;	// how much in one sample
  //
  for i := 0 to nSamples - 1 do begin
    //
    second[0, i] := round(sin(angle) * Volume1);
    angle := angle + delta;
  end;

  nSamples := sps * time2 div 1000;	// signal length in samples
  //
  angle := 0;
  delta := (freq2 / sps) * 2 * Pi;	// how much in one sample
  //
  for i := 0 to nSamples - 1 do begin
    //
    second[1, i] := round(sin(angle) * Volume2);
    angle := angle + delta;
  end;

  nSamples := sps * time3 div 1000;	// signal length in samples
  //
  angle := 0;
  delta := (freq3 / sps) * 2 * Pi;	// how much in one sample
  //
  for i := 0 to nSamples - 1 do begin
    //
    second[2, i] := round(sin(angle) * Volume3);
    angle := angle + delta;
  end;
end;

// -- main --

var
  i: integer;
  wout: hWaveOut = 0;
  fmt: tWAVEFORMATEX;
  hdr: array[0..2] of WAVEHDR;
begin
  prepareSine();
  //
  With fmt do
  Begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := 1;
    nSamplesPerSec := SPS;
    wBitsPerSample := 16;
    nBlockAlign := nChannels*wBitsPerSample div 8;
    nAvgBytesPerSec := nSamplesPerSec*nBlockAlign;
    cbSize := 0;
  End;
  //
  WaveOutOpen(@wout, cardinal(-1), @fmt, 0, 0, 0);
  if (0 <> wout) then
  begin
    //
    for i := 0 to 2 do
    begin
      //
      fillChar(hdr[i], sizeof(hdr), #0);
      hdr[i].lpData := @second[i];
      hdr[i].dwBufferLength := sizeof(second[i]);
      //
      waveOutPrepareHeader(wout, @hdr[i], sizeof(hdr[i]));
      WaveOutWrite(wout, @hdr[i], sizeof(hdr[i]));
    end;
    //
    Sleep(3100);	// sleep for 3 seconds
    //
    waveOutUnprepareHeader(wout, @Hdr, sizeof(Hdr));
    waveOutReset(wout);
    WaveOutClose(wout);
  end;
end.
JekaDefer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с выводом звука определенной частоты в короткие промежутки времени. JekaDefer Общие вопросы Delphi 31 28.08.2012 08:04
Проблема с тегами и выводом NARKOM PHP 1 25.09.2011 10:29
проблема с выводом -=Andriushka=- Помощь студентам 0 13.04.2011 21:46
проблема с выводом информацыи Betman Общие вопросы Delphi 2 29.10.2009 17:09
Проблема с выводом строки kezman Общие вопросы C/C++ 1 30.08.2008 20:41