Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MemoryStream.SetSize не слушается [D7, XP]


Страницы:   1 2

rammic ©   (2011-08-17 16:11:00) 

Прошу помощи у мастеров. Не смог найти программу,которая меня бы устроила, поэтому пришлось сочинять самому. На настоящего программиста она, наверное,произведет впечатление велосипеда, связанного веревками, но она работает и делает то, что мне нужно, кроме одного.
Вопрос в следующем. Программа генерирует различные
звуки, но только 24 секунды при nChannels:= Stereo; nSampleRate:= 44100; при nChannels:= Mono; соответственно - 44 секунды. Вывел в Edit intToStr(ms.Size) Если меньше 24 секунд все показывает правильно если - больше показывает 46.Наверное это размер WaveFormatEx. И, естественно, не играет.
Пробовал перед заполнением звуковыми данными писать ms.SetSize(RiffCount)- не обращает внимания, показывает те же 46.
Можно ли увеличить MemoryStream.Size  до нужного размера,
Например, на 3 минуты?


Сергей М.   (2011-08-18 18:37:00) [1]


> там везде звука
> на 1 секунду, А потом его зацикливают.
>


Об этом.


rammic   (2011-08-18 18:08:00) [2]


> Сергей М. ©   (18.08.11 17:28) [19]
> Да еще и 24-секундный семпл поди заloopленый..

Это Вы о чем?


Сергей М.   (2011-08-18 17:28:00) [3]

Да еще и 24-секундный семпл поди за loopленый..


rammic   (2011-08-18 17:27:00) [4]

Спасибо, теперь все получается, поет сколько угодно, Хотя во всех
программах, которые я смотрел, DataCount  считается в милисекундах,
а потом делится на 1000 - глупость какая-то. Правда там везде звука
на 1 секунду, А потом его зацикливают.


Dennis I. Komarov   (2011-08-18 16:31:00) [5]


> А нафига вот такие действия делать?

Он камасутру не читал... Грабли у каждого свои, но одинаковые...


Ega23   (2011-08-18 16:20:00) [6]

d, поди Integer?

А нафига вот такие действия делать?
(2 * 24000 * 44100) div 1000
вместо
(2 * 24 * 44100)?


sniknik   (2011-08-18 15:57:00) [7]

> Чего это Оно?
переполнение? в признак отрицательного числа влезли, т.к. тип знаковый?


rammic   (2011-08-18 15:49:00) [8]

Интересное дело, ошибка оказалась в самом неожиданном месте
d:= (2 * 24000 * 44100) div 1000 показывает вменяемый ответ, а
d:= (2 * 25000 * 44100) div 1000 показывает черт знает что.
Чего это Оно?


Ega23   (2011-08-17 21:31:00) [9]


> SQLEXPRESS   (17.08.11 18:13) [7]
>
> ты так раньше не писал...


Ну почему, всяко бывало. Просто я один раз ОООЧЕНЬ здорово с with накололся, с тех пор его крайне аккуратно использую. Ну а тут пример тривиальный, двоякого толкования быть не могёт.


Медвежонок Пятачок   (2011-08-17 19:15:00) [10]

Опа.
Теперь у нас уже "Он", и "Тот кто его дает"
Уже двое!


rammic   (2011-08-17 19:09:00) [11]

Я не знаю, кто его дает


Медвежонок Пятачок   (2011-08-17 18:56:00) [12]

император звука конечно же.


Германн   (2011-08-17 18:44:00) [13]


> по умолчанию, он дает 24 секунды звука

А кто он?


rammic   (2011-08-17 18:23:00) [14]

Size нужно потому, что, по умолчанию, он дает 24 секунды звука, а
больше не хочет.  SetSize я писал после того как ввел все параметры,
но на это нет реакции. А какие параметры я введу я и сам не знаю.
Наверное из initialization TMemoryStream.Create нужно перенести
в ButtonClick. Спасибо, буду пробовать


SQLEXPRESS   (2011-08-17 18:13:00) [15]


>  with .Create do

ты так раньше не писал...


Ega23   (2011-08-17 17:58:00) [16]


> Дело в том, что  ms:= TMemorySteream.Create  я написал в initialization,
> а ms.Free в finalization.


Да хоть где.
Вопрос был: Можно ли увеличить MemoryStream.Size  до нужного размера,
Например, на 3 минуты?


Ответ: можно.
Вот тебе гигабайт:

 with TMemoryStream.Create do
   try
     Size := 1024*1024*1024;
     ShowMessage(IntToStr(Size));
   finally
     Free;
   end;



> Может здесь написать SetSize?


А вот это я уже без понятия, это твой код. Я вообще не сильно понимаю, зачем тебе Size нужно.


rammic   (2011-08-17 17:54:00) [17]

Дело в том, что  ms:= TMemorySteream.Create  я написал в initialization,
а ms.Free в finalization.
procedure TForm1.btnPlayClick(Sender: TObject);
 begin
   if(ms.Size <> 0) then ms.Clear;
Может здесь написать SetSize?
  Partitura
   ArrayFourier;
   GraphicVolni;
   if(chbFpoFunc.Checked = True) then GraphicKFourier;

   MakeSound(strToInt(edDuration.Text),rdgrChannels.ItemIndex);
             
   Play_Sound;
 end;


Dennis I. Komarov   (2011-08-17 17:35:00) [18]

procedure TForm19.Button6Click(Sender: TObject);
begin
with TMemoryStream.Create do
  try
    Size := 2 * 24 * 44100 + 46;
    ShowMessage(IntToStr(Size));
  finally
    Free;
  end;
end;


см. [1]


Ega23   (2011-08-17 17:34:00) [19]


> Size 1000 он устанавливает без напоминания. 24 секунды  это
> (2 * 24 * 44100 + 46) байт тоже сам устанавливает. Можно ли больше?


Неужели так сложно проверить?

procedure TForm19.Button1Click(Sender: TObject);
begin
 with TMemoryStream.Create do
   try
     Size := (2 * 24 * 44100) + 46 + 100500;
     ShowMessage(IntToStr(Size));
   finally
     Free;
   end;
end;


rammic   (2011-08-17 17:27:00) [20]

Size 1000 он устанавливает без напоминания. 24 секунды  это
(2 * 24 * 44100 + 46) байт тоже сам устанавливает. Можно ли больше?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо