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

Вниз

Как затормозить MediaPleer?   Найти похожие ветки 

 
Доцент   (2006-12-15 01:20) [0]

Нужно, чтобы программа проговаривала числа. Звуковые файлы есть, алгоритм сопоставления тоже есть.
Программа прочитав, например, число 1234 должна проиграть 4 звуковых файла.
НО!!! После чтения первого файла и передачи его звуковой карте немедленно читается и передается второй и так далее. Звуковая карта не успевает произнести предыдущий, как получает команду на следующий. В результате слышно только последний: "ЧЕТЫРЕ".
Применение OnTimer очень сложно и заморочисто.
Посоветуйте, как быть???
Наверняка кто-то сталкивался...
Пишите лучше на artigor68@mail.ru, я здесь новенький


 
Rial ©   (2006-12-15 01:46) [1]

Предложу гадкий способ, но он в данным случае поможет.
Думаю, звук у тебя хранится в WAV формате.
Размет звука каждой цифры наверняка тоже невелик.
Поэтому стоит получить сначала имена файлов,
а затем обеъдинить весь звук в 1 файл формата WAV.
Несжатый звук имеет просто формат, найти
его описание не составит труда.
Затем проигрываем этот 1 файл.

Также для ускорения можно попробовать использовать
звуковые библиотеки типа OpenAL или Bass.


 
Доцент   (2006-12-15 01:57) [2]

Совет понял.
Не умею объединять WAV файлы, хотя мысль замечательная.
Мой друг делает это в Visual Basic с помощью какой-то надстройки, которая тормозит программу пока не проиграется первый файл и т.д.,
а предложенный способ мне кажется эффективнее.
Только подскажи, как файлы объединять


 
Rial ©   (2006-12-15 03:59) [3]

Вот кусок кода, который отвечает за загрузку
звука в формате WAV для использования в OpenAL.

Компилироваться, наверняка, не будет,
но принцип основной понять можно.
Также отсюда можно понять, как устроен WAV файл.

В результате в Data размещаются звуковые данные.
Тебе необходимо вынуть эти данные из всех
звуков по-отдельности и склеить их.
Не забудь подкорректировать заголовок.

Короче говоря, при желании разобраться
этой информации должно хватить.

Type

    TALSizeI = Cardinal;
    TALuByte = Char;
    TALuInt = Cardinal;
    TALuShort = Word;
    TALEnum = Integer;
    TALVoid = Pointer;
     //  Заголовок WAV файла
    TWAVFileHdr_Struct  =  packed record
     Id : Array[0..3]of TALuByte;
     Size : TALsizei;
     Type_ : Array[0..3]of TALuByte;
    end;

     // Заголовок WAV формата
    TWAVFmtHdr_Struct  =  packed record
     Format : TALuShort;
     Channels : TALuShort;
     SamplesPerSec : TALuInt;
     BytesPerSec : TALuInt;
     BlockAlign : TALuShort;
     BitsPerSample : TALuShort;
    end;
     //  Расширенный заголовок WAV формата
    TWAVFmtExHdr_Struct  =  packed record
     Size : TALuShort;
     SamplesPerBlock : TALuShort;
    end;
     // Зацикленность
    TLoop  =  packed record
     Identifier :  TALuint;
     Type_ : TALuInt;
     Start : TALuInt;
     End_ : TALuInt;
     Fraction : TALuInt;
     Count : TALuint;
    end;
     // Заголовок WAV семпла
    TWAVSmplHdr_Struct  =  packed record
     Manufacturer : TALuInt;
     Product : TALuInt;
     SamplePeriod : TALuInt;
     Note : TALuInt;
     FineTune : TALuInt;
     SMPTEFormat : TALuInt;
     SMPTEOffest : TALuInt;
     Loops : TALuInt;
     SamplerData : TALuInt;
     Loop : TLoop;
    end;
     // Заголовок WAV чанка
    TWAVChunkHdr_Struct  =  packed record
     Id : Array[0..3] of TALuByte;
     Size : TALuInt;
    end;

procedure ralLoadWAVMemory(const Stream: TMemoryStream; var Format: TALEnum; var Data: TALvoid;
 var Size: TALSizeI; var Freq: TALSizeI; var Loop: TALInt);
var ChunkHdr: TWAVChunkHdr_Struct;
 FmtExHdr: TWAVFmtExHdr_Struct;
 FileHdr: TWAVFileHdr_Struct;
 SmplHdr: TWAVSmplHdr_Struct;
 FmtHdr: TWAVFmtHdr_Struct;
begin
 Format := AL_FORMAT_MONO16;
 Data := nil;
 Size := 0;
 Freq := 22050;
 Loop := AL_FALSE;
 if (Stream.Size > 0) then begin
   try
     if (Stream <> nil) then begin
       Stream.Read(FileHdr, SizeOf(TWAVFileHdr_Struct));
       FileHdr.Size := ((FileHdr.Size + 1) xor 1) - 4;
       while ((FileHdr.Size <> 0) and (Stream.Read(ChunkHdr, SizeOf(TWAVChunkHdr_Struct)) <> 0)) do begin
         if (CompareMem(@ChunkHdr.Id, PChar("fmt "), 4)) then begin
           Stream.Read(FmtHdr, SizeOf(TWAVFmtHdr_Struct));
           if (FmtHdr.Format = $0001) then begin
             if (FmtHdr.Channels = 1) then begin
               if (FmtHdr.BitsPerSample = 8) then Format := AL_FORMAT_MONO8
               else Format := AL_FORMAT_MONO16;
             end else
               if (FmtHdr.BitsPerSample = 8) then Format := AL_FORMAT_STEREO8
               else Format := AL_FORMAT_STEREO16;
             Freq := FmtHdr.SamplesPerSec;
             Stream.Seek(ChunkHdr.Size - SizeOf(TWAVFmtHdr_Struct), soFromCurrent);
           end else begin
             Stream.Read(FmtExHdr, SizeOf(TWAVFmtExHdr_Struct));
             Stream.Seek(ChunkHdr.Size - SizeOf(TWAVFmtHdr_Struct) - SizeOf(TWAVFmtExHdr_Struct), soFromCurrent);
           end;
         end else
           if (CompareMem(@ChunkHdr.Id, PChar("data"), 4)) then begin
             if (FmtHdr.Format = $0001) then begin
               Size := ChunkHdr.Size;
               Data := rmGetMem(Size + $20);
               if (Data <> nil) then
                 Stream.Read(data^, Round(ChunkHdr.Size {/ FmtHdr.BlockAlign}));
               FillChar(PByteArray(data)[ChunkHdr.Size], $20, 0);
             end else
               if (FmtHdr.Format = $0011) then begin //IMA ADPCM
               end else
                 if (FmtHdr.Format = $0055) then begin //MP3 WAVE
                 end;
           end else
             if (CompareMem(@ChunkHdr.Id, PChar("smpl"), 4)) then begin
               Stream.Read(SmplHdr, sizeof(TWAVSmplHdr_Struct));
               if (SmplHdr.Loops <> 0) then Loop := AL_TRUE
               else Loop := AL_FALSE;
               Stream.Seek(ChunkHdr.Size - sizeof(TWAVSmplHdr_Struct), soFromCurrent);
             end else
               Stream.Seek(ChunkHdr.Size, soFromCurrent);
         Stream.Seek(ChunkHdr.Size and 1, soFromCurrent);
         FileHdr.Size := FileHdr.Size - (((ChunkHdr.Size + 1) and not 1) + 8);
       end;
     end;
   except
     Exit;
   end;
 end;
end;


 
Думкин ©   (2006-12-15 06:56) [4]

PlaySound SND_SYNC


 
Сергей М. ©   (2006-12-15 15:45) [5]


> Нужно, чтобы программа проговаривала числа


> Посоветуйте, как быть?


Не изобретать велосипед с wav-файлами, а воспользоваться готовым ПО, например, Microsoft Speech Engine


 
Rial ©   (2006-12-15 17:35) [6]

> [5] Сергей М. ©   (15.12.06 15:45)
> Не изобретать велосипед с wav-файлами, а воспользоваться
> готовым ПО, например, Microsoft Speech Engine

Ну, а что плохого в том, чтобы самому изобрести велосипед ?
Ведь есть же, хоть и очень небольшая, вероятность, что его
велосипед будет по каким то параметрам лучше.
Как же еще научные открытия делают ? :)

Тем более, опыт, полученный в результате работы
даже над безнадежным проектом все равно может оказаться
бесценным.
Это, конечно, если на все это есть время и возможность.
А, скорее, желание. :)

А жить на всем готовеньком просто не интересно !!


 
Доцент   (2006-12-15 23:43) [7]

Согласен с mr.Rial. Спасибо за участие, начну копаться, результат покажу


 
Думкин ©   (2006-12-17 19:36) [8]

> Сергей М. ©   (15.12.06 15:45) [5]

Оно хорошо, но с самими энжинами на русском и бесплатно - напряг. По крайней мере, я хорошего не видел.
========

А числа говорить не беда - наговори файлов и используй мое. Только просто наговорить отдельно - эффект не тот. У меня до ноналионов говорит так - лет 7 как писал назад.


 
Думкин ©   (2006-12-17 19:38) [9]

А если уж очень хочется Медиаплеер - смотри его Нотифай.



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
8-1166202785
DriveR_F
2006-12-15 20:13
2007.09.23
Как распознать текст на картинке?


8-1166262763
niko
2006-12-16 12:52
2007.09.23
Загрузка BitMap а и вывод его на форму в Си


15-1187958426
BaryVetaL
2007-08-24 16:27
2007.09.23
OpenOffice Calc + Delphi


3-1174479646
DelphiLexx
2007-03-21 15:20
2007.09.23
Объект по работе с cross-таблицей


2-1188365803
Алик
2007-08-29 09:36
2007.09.23
Как сделать окно главным относительно других?