Буфер в DirectSound, чтоб его...

Тема в разделе "Библиотеки и интерфейсы", создана пользователем Rustem, 15 мар 2005.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приветствую, господа!



    В целях самообразования, занимаюсь вытаскиванием музыки из демок(интро), которые используют для вывода музыки DirectSound (а кто его не использует ;)





    В общем перехватил я в отладчике вызовы методов

    ->SetFormat

    ->Lock

    ->Unlock - По аргументам функции известно, где лежит буфер с музыкой и его размер.

    Дампим его!!!



    Потом присоединив стандартный wav заголовок к началу дампа и поправив

    некоторые поля (поля беруться из аргументов, переданных SetFormat) получаем wav-файл...



    Но, вместе с самой музыкой играется какой-то очень неприятный шум,

    точнее даже наоборот - на фоне шума играет музыка ;(



    Что делать...???

    Ведь этот же трюк с API функциями типа waveOut*** (waveOutWrite) работал отлично...
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Хм, странно.. может быть не учёл, что буфер кольцевой?
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    2 S_T_A_S_

    Кольцевой то он кольцевой, но длина то у него известна.



    Никак не пойму в чем дело...
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вот и я не пойму. Простейший способ вывода такой:
    Код (Text):
    1.     void              * write_cursor;
    2.     unsigned long       size;
    3.     sound_buffer->Lock(soundbuffer_position, soundbuffer_chunk_size, &write_cursor, &size, 0, 0, 0);
    4.     copy(write_cursor, &local_buffer, size);
    5.     sound_buffer->Unlock(write_cursor, size, 0, 0);


    Видно же, что буфер содержит нужные данные. Может хитрая прога какая? ты не сравнивал то, что возвращает Lock с тем, что передаётся в Unlock?
     
  5. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Может и хитрая, но ведь в буфер то передаются данные определенного формата -> формат известен



    Посмотрел wav в SoundForge.

    Видно что непосредственно с музыкой периодически присутствуют пики (если судить по шкале то музыка где-то 20% а сами пики где-то 80%)

    Откуда они взялись???

    Уже пришла идея интерполировать.

    Но не по дзенски как-то это. Должна же музыка быть в нормальном виде, и соответственно ее можно вытащить в этом нормальном виде.
     
  6. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    кстати, немного не по теме, но спрошу. Как можно сделать аналогичную штуку, но для видео ?
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Rustem



    Сам посуди - я вызываю IDirectSoundBuffer::Lock, получаю алрес (возможно 2) и размер блоков.

    Копирую туда "кусок" wav, потом делаю IDirectSoundBuffer::Unlock.

    Если ты его перехватишь - все данные твои.

    Другое дело, похоже, можно делать Unlock(0, 0, 0, 0) и музыка всё равно будет играть!

    Попробуй брать адреса кусков буфера именно из Lock.





    infern0



    по правилам наверное, следует делать какой-то DirectShow фильр.

    а так - перехватывай IDirectDrawSurface::Lock - имееш данные (адрес и формат) поверхности, куда рендер рисует.

    Потом IDirectDrawSurface::Unlock - кадр лежит в памяти, делай что нужно :)

    Там COM, но адреса можно посмотреть в сайсе - ddraw!DD_Surface_Lock и ddraw!DD_Surface_Unlock4 (ещё есть ddraw!DD_Surface_Unlock, это старый интерфейс)
     
  8. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    S_T_A_S_

    Насчет взять адреса из Lock-попробую обязательно.

    Спасибо за совет.
     
  9. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Все,сделал, работает!!!!



    Похоже глюк был в дампере (какой-то плагин к Olly)

    Написал свой, внедрил как длл и сдампил кусок. Все заработало отлично.
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Rustem

    > Похоже глюк был в дампере (какой-то плагин к Olly)



    PETools, LordPE - "дамп регион" не устраивают?
     
  11. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Что-то я совсем забыл про них ;)



    Сейчас пишу автоматический выдиратель музыки из приложений

    (Наверно только из демок\интро)