Конференция "Media" » Воспроизвести WAV из части файла.
 
  • AlexanderMS © (09.01.08 17:59) [0]
    Есть один большой файл, который состоит из нескольких файлов (несжатый архив), в числе которых и WAV-файл. Нужно  воспроизвести этот WAV-файл с помощью DirectSound (известно смещение относительно начала архива и длина файла), не заводя дополнительных файлов. Подскажите, пожалуйста, как это можно сделать?
  • @!!ex © (09.01.08 18:43) [1]
    Прочитать в память кусок, создать сэпл DirectSound, передать ему этот кусок... и гиде проблема???
  • AlexanderMS © (09.01.08 19:10) [2]

    > гиде проблема???

    Проблема в том, что я совершенно не изучал и не разбирался с DirectSound, подключил готовый звуковой движок и всё (конечно, я не прав, но времени на всё не хватает). Вот код загрузки из файла:

    constructor TSound.Create(FileName : string);
    var
     R : HRESULT;
     pConfig : IUnknown;
    begin
     FVolume := 75;
     AutoDelete := true;
     AddSoundToArray(Self);

     if not assigned(Loader) then
     begin
         ;//Log('Playing \"' + FileName + '\"... The SoundManager isn''t loaded !', true);
     end else begin
         R := Loader.LoadObjectFromFile(CLSID_DirectMusicSegment, IDirectMusicSegment8,
                                        pwidechar(WideString(FileName)), Segment);
         if FAILED(R) then
         begin
            //Log('The Sound \"' + FileName + '\" isn''t loaded: ' + DMErrorString(R), true);
    //         ShowError('The Sound \"' + FileName + '\" isn''t loaded: ' + DMErrorString(R));

            Segment := nil;
            Exit;
         end;

         if SUCCEEDED(Segment.GetAudioPathConfig(pConfig)) then begin
            R := Performance.CreateAudioPath(pConfig,
                              true,
                              Path);
            pConfig := nil;
         end else begin
            R := Performance.CreateStandardAudioPath(MONO_STEREO[InitStereo],
                                                     InitChannels, true, Path);
         end;

         if FAILED(R) then DirectMusicLog(R);

         SetVolume(FVolume);
         Segment.Download(Performance);
     end;
    end;



    Понятия не имею, куда и что можно добавить. :)
  • @!!ex © (09.01.08 19:33) [3]
    > [2] AlexanderMS ©   (09.01.08 19:10)

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

    P.S.
    DirectMusic и DirectSound - разные вещи.
    Дело в том, что DM НЕ загружает сэмпл в память полностью, а подгружает по мере проигрывания. Тебе использовать DM не кактит вообще.
  • Сергей М. © (10.01.08 08:55) [4]

    > AlexanderMS


    см. sndPlaySound() с флагом SND_MEMORY
  • AlexanderMS © (10.01.08 10:00) [5]

    > см. sndPlaySound() с флагом SND_MEMORY

    У меня игра, и несколько звуков должно играть асинхронно.


    > Не знаю что за движок используешь.

    Движок Devil's Engine.

    ---
    Буду разбираться.
  • Сергей М. © (10.01.08 14:29) [6]

    > несколько звуков должно играть


    В DS наверняка есть соотв. объекты/методы/свойства.

    В кр.случае ничто не мешает месить аудиопотоки ручками и готовую смесь подавать на съедение той же sndPlaySound()
 
Конференция "Media" » Воспроизвести WAV из части файла.
Есть новые Нет новых   [133928   +471][b:0][p:0.001]