Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.04;
Скачать: CL | DM;

Вниз

MemoryStream.SetSize не слушается   Найти похожие ветки 

 
rammic ©   (2011-08-17 16:11) [0]

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


 
Ega23 ©   (2011-08-17 16:30) [1]


procedure TForm19.Button6Click(Sender: TObject);
begin
 with TMemoryStream.Create do
   try
     Size := 1000;
     ShowMessage(IntToStr(Size));
   finally
     Free;
   end;
end;


Всё работает, ищите ошибку в другом месте.


 
rammic ©   (2011-08-17 17:27) [2]

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


 
Ega23 ©   (2011-08-17 17:34) [3]


> 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;


 
Dennis I. Komarov ©   (2011-08-17 17:35) [4]

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


см. [1]


 
rammic ©   (2011-08-17 17:54) [5]

Дело в том, что  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;


 
Ega23 ©   (2011-08-17 17:58) [6]


> Дело в том, что  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 нужно.


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


>  with .Create do

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


 
rammic ©   (2011-08-17 18:23) [8]

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


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


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

А кто он?


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

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


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

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


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

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


 
Ega23 ©   (2011-08-17 21:31) [13]


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


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


 
rammic ©   (2011-08-18 15:49) [14]

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


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

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


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

d, поди Integer?

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


 
Dennis I. Komarov ©   (2011-08-18 16:31) [17]


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

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


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

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


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

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


 
rammic ©   (2011-08-18 18:08) [20]


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

Это Вы о чем?


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


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


Об этом.



Страницы: 1 вся ветка

Текущий архив: 2011.12.04;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
15-1313059279
Palladin
2011-08-11 14:41
2011.12.04
FireMonkey


2-1313842570
Gu
2011-08-20 16:16
2011.12.04
двумерный массив


8-1220951683
Konung
2008-09-09 13:14
2011.12.04
Рисовать на pf32bit битмапе


15-1313145936
ProgRAMmer Dimonych
2011-08-12 14:45
2011.12.04
Дизассемблер: переводить или искать аналог?


2-1313438873
анонимус
2011-08-16 00:07
2011.12.04
std::sort на делфи