DirrectSound

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

  1. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Зачем. Ошибка всеравно не в структуре программы. Не работает макрос comcall. Типа я знаю что писать, но не знаю как.

    ЗЫ: У примера из SDK небыло шансов скомпилироватся.
     
  2. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Ошибка как раз не в макросе, а в "структуре программы". Следуйте советам :)
     
  3. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Где??? Структура такая:
    1. Создать объект DirectSound.
    2. Установить кооперацию.
    ...........
    Второе действие не могу реализовоть из за ошибки на строке (строка из примера!!!). Строка использует макрос, на который тоже указывает fasm. Каким тогда чудесным образом может быть ошибка в структуре в одной строке??? %)

    По поводу обхода макроса: [eax+object#.#proc] Что означает #.#proc ???
     
  4. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Молодой человек. Откройте, пожалуйста, папку %fasmroot%\examples и поищите там примеры ddraw и usecom. Там все ОЧЕНЬ просто и чем тут ждать чуда, может стоит чуточку подумать самому?..
     
  5. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Дак уж долго думаю, не помогает ( .
    Если не трудно, напишите ктонибудь как мне применить SetCooperativeLevel к pDirectSound. Я пробовал как в примере:
    comcall pDirectSound,SetCooperativeLevel,NULL,DSSCL_NORMAL - Выдает ошибку.

    Пробовал так:
    mov eax,dword[pDirectSound]
    mov eax,dword[eax]
    push DSSCL_NORMAL
    push [hwnd]
    push SetCooperativeLevel
    push dword[pDiretctSound]
    call dword[eax+func_offset*4]
    К строке выдает ошибку undefined symbol , хотя подключен файл dsound8.inc

    Правильно ли я понял: чтобы использовать метод, мне нужно указать его адрес в виртуальной таблице методов??? таблице
     
  6. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    wcools
    Код (Text):
    1. mov    eax,dword[pDirectSound]
    2. mov    eax,dword[eax]
    3. push   DSSCL_NORMAL
    4. push   [hwnd]
    5. push   dword[pDiretctSound]
    6. call   dword[eax+xxx*4]
    Где: xxx - смещение функции SetCooperativeLevel относительно начала таблицы
    методов интерфейса IDirectSound
     
  7. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    wcools
    Дайте мне описание интерфейса IDirectSound.
     
  8. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Код (Text):
    1. call   dword[eax+xxx*4]
    Даже на 4 умножать не надо
     
  9. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Блин ну я не знаю!.. Неужели правда не ясно? Под рукой нет SDK. И фасма тоже нет. И пишу я со смартфона) берете SDK, ищите там интерфейс DirectSound. Далее его объявляете:
    Код (Text):
    1. interface DirectSound,\
    2. ...
    3. SetCooperativeLevel,\
    4. ...
    Далее объявляете
    Код (Text):
    1. pDirectSound DirectSound
    и что-то вроде
    Код (Text):
    1. invoke DirectSoundCreate,0,pDirectSound,0
    2. ...
    3. comcall pDIrectSound,SetCooperativeLevel,[hWnd],DSSCL_NORMAL
    4. ...
    Et cetera.
     
  10. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Вот только интерфейс надо объявить точно, как в оригинальном SDK,
    а то ничего не будет работать
     
  11. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    wcools

    Похоже что ты скачал пакет для фасма в котором есть инклуды для Direct3D и directsound.
    Он был написан в далеком 2005 году и фасм для компиляции там используется старый. Старее чем 1.64, поэтому те примеры которые там идут, без проблем скомпиляются на старой версии фасма. Под новую мне было править лень, там косяки с макросами, если кто подскажет как поменять под новую версию я исправлю.
     
  12. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Чето я такое в примере не видел.

    Символ в символ - такуюже строки пишу и не работает (((

    Может быть.

    Кста вот пример из SDK
     
  13. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Я смотрю все втуне... Значит перед секцией данных пишите:
    Код (Text):
    1. interface DirectSound,\
    2.           QueryInterface,\
    3.           AddRef,\
    4.           Release,\
    5.           CreateSoundBuffer,\
    6.           GetCaps,\
    7.           DuplicateSoundBuffer,\
    8.           SetCooperativeLevel,\
    9.           Compact,\
    10.           GetSpeakerConfig,\
    11.           SetSpeakerConfig,\
    12.           Initialize,\
    13.           VerifyCertification
    Ниже pDirectSound dw ? меняете на pDirectSound DirectSound. Ну и вместо comcall DirectSoundCreate8 пишите cominvk DirectSoundCreate. Бином Ньютона, не иначе!..
     
  14. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    wcools

    Приложеный пример это из пакета directx 8.1 for fasm.

    Компилится старой версией фасма, я бы не стал морочить голову пытаясь написать новые инклуды.
     
  15. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    В догонку, новый макрос comcall был введен взамен того что присутстововал в fasm (cominvk)
    чтобы проще было переделывать инклуды от пакета для Masm. Отсюда все эти грабли.
     
  16. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Огромное спасибо. Заработало :) :) :)

    Еще вопросы:
    Что значит interface DirectSound,\
    QueryInterface,\
    AddRef,\.........
    .............
    Это же виртуальная таблица методов???

    Чеото не работае чтение файла; конкретно программа вылетает из-за ф-й
    cominvk pDSSample,Lock1,0,[ChInf.ckSize],S_data,S_lengte,0,0,0
    cominvk pDSSample,Unlock,[S_data],[S_lengte],0,0
    Из за чего это может быть?


    Вот весь кусок загрузки файла:

    Код (Text):
    1. ;--------------Читаем файл-------------------
    2. invoke  GetOpenFileName,fopen               ;Функция вызова диалога открытия файла.
    3. mov [hM],eax                    ;Запоминаем указатель на открытый файл в hM
    4. invoke  mmioOpen,fname,0,MMIO_READ          ;Возвращает (нестандартный) иденти-фикатор открытого файла в fname
    5. mov [ChInf.fccType],"WAVE"              ;инициализирование значение поля .fccType структуры MMCKINFO, чтобы функция знала тип искомого блока.
    6. invoke  mmioDescend,[hM],ChInf,0,MMIO_FINDRIFF      ;Чтение заголовка файла
    7. mov [ChInf.ckid],"fmt"              ;инициализирование значение поля ckid
    8. invoke  mmioDescend,[hM],ChInf,WInf,MMIO_FINDCHUNK  ;чтение Формата файла в заголовке WAVE
    9. invoke  mmioRead,[hM],WavFt,[ChInf.ckSize]      ;Считывание формата
    10. invoke  mmioAscend,[hM],ChInf,0             ;Закрываем вложенный блок
    11. mov [ChInf.ckid],"data"             ;инициализирование значение поля ckid (читаем звуковые данные)
    12. invoke  mmioDescend,[hM],ChInf,WInf,MMIO_FINDCHUNK  ;Читаем данные
    13. ;--------------------------------------------
    14.  
    15. ;--------------Заполнение WavFt - структуры типа буфера--------------
    16. mov [WavFt.wFormatTag],1                ;Команда формата
    17. mov [WavFt.nChannels],2             ;Число каналов
    18. mov [WavFt.nSamplesPerSec],8000         ;Частота
    19. mov [WavFt.nAvgBytesPerSec],32000           ;Байт в секунду
    20. mov [WavFt.nBlockAlign],4               ;Выравнивание данных в data-чанке
    21. mov [WavFt.wBitsPerSample],16
    22. ;--------------------------------------------------------------------
    23.  
    24. ;--------------Заполнение BuferT - структуры для создания буфера-----
    25. mov [BuferT.dwSize],sizeof.DSBUFFERDESC     ;Размер структуры
    26. mov [BuferT.dwFlags],DSBCAPS_GLOBALFOCUS        ;Флаг
    27. mov eax,[ChInf.ckSize]              ;Кидаем в eax размер данных
    28. mov [BuferT.dwBufferBytes],eax          ;Размер буфера
    29. lea eax,[WavFt]
    30. mov [BuferT.lpwfxFormat],eax            ;Указатель на заполненную структуру WAVEFORMATEX
    31. ;--------------------------------------------------------------------
    32.  
    33. cominvk pDirectSound,CreateSoundBuffer,BuferT,pDSSample,0    ;Создаем буфер
    34. cominvk pDSSample,Lock1,0,[ChInf.ckSize],S_data,S_lengte,0,0,0
    35. invoke  mmioRead,[hM],[S_data],[ChInf.ckSize]
    36. cominvk pDSSample,Unlock,[S_data],[S_lengte],0,0
     
  17. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    wcools
    > Что значит interface DirectSound,\
    > QueryInterface,\
    > AddRef,\.........
    > .............
    Читайте статьи про COM/OOP.