Визуализация музыки (DirectShow, IUnknown)

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 29.05.2011 (Вс) 10:00

Внезапно захотелось сделать свою визуализацию музыки.
Для этого нужно написать анализатор спектра, а для него, в свою очередь, нужно получить буфер сэмплов звука.

Стал пробовать решить эту задачу через VB6 + DirectShow.
В DX_SDK8.1 есть интерфейс для бейсика и даже пара примеров, но документации нету.

Создаю стандартный DirectShow-фильтр SampleGrabber, подключаю его в граф фильтров перед Default DirectSound Device.
Музыка играет, то есть граф работает. Вот такой код получился:

Код: Выделить всё
Option Explicit

Dim graphManager As New FilgraphManager
Dim filterChain As New Collection

Private Sub Form_Load()
  Dim filter As IFilterInfo
  Dim pin As IPinInfo
 
  ' Добавляем источник (mp3-файл) и рендерим его pin
  ' Все необходимые фильтры при этом создаются и подключаются автоматически
  Dim fileName As String
  fileName = "C:\music.mp3"
  graphManager.AddSourceFilter fileName, filter
  filterChain.Add filter
  filter.Pins.Item 0, pin
  pin.Render

  ' Пробегаемся по связям фильтров и запоминаем их последовательность
  Do
    If pin Is Nothing Then Exit Do
    If pin.ConnectedTo Is Nothing Then Exit Do
    Set filter = pin.ConnectedTo.FilterInfo
    filterChain.Add filter, filter.Name
    Set pin = GetDirectionPin(filter, 1)
  Loop
 
  ' Размыкаем 2 последних фильтра
  Dim inFilter As IFilterInfo
  Dim outFilter As IFilterInfo
  Set outFilter = filterChain(filterChain.Count)
  Set inFilter = filterChain(filterChain.Count - 1)
  GetDirectionPin(inFilter, 1).Disconnect
 
  ' Создаём SampleGrabber фильтр и вклиниваем между ними
  Dim grabberFilter As IFilterInfo
  Dim regFilter As IRegFilterInfo
  For Each regFilter In graphManager.RegFilterCollection
    If regFilter.Name = "SampleGrabber" Then
      regFilter.filter grabberFilter
      filterChain.Add grabberFilter, grabberFilter.Name, outFilter.Name
      Exit For
    End If
  Next
  ConnectFilters inFilter, grabberFilter
  ConnectFilters grabberFilter, outFilter
 
  ' Выводим на экран получившуюся цепочку
  For Each filter In filterChain
    infoList.AddItem filter.Name
  Next
 
  ' Запускаем граф
  Dim objPosition As IMediaPosition
  Set objPosition = graphManager
  objPosition.CurrentPosition = 0
  graphManager.Run
End Sub

' Соединяет два фильтра
Function ConnectFilters(inFilter As IFilterInfo, outFilter As IFilterInfo)
  GetDirectionPin(inFilter, 1).ConnectDirect GetDirectionPin(outFilter, 0)
End Function

' Возвращает первый найденный pin у фильтра в нужном направлении
Function GetDirectionPin(filter As IFilterInfo, direction As Integer) As IPinInfo
  Dim pin As IPinInfo
  For Each pin In filter.Pins
    If pin.direction = direction Then
      Set GetDirectionPin = pin
      Exit Function
    End If
  Next
End Function


По идее, дальше нужно настроить CallBack'и для SampleGrabber'a, но как к нему обратиться из VB - непонятно.
В VB его тип Unknown, но известен интерфейс (описан в SDK) и даже можно найти GUID:

Код: Выделить всё
static const IID IID_ISampleGrabber = // {6B652FFF-11FE-4fce-92AD-0266B5D7C78F} 
static const CLSID CLSID_SampleGrabber = // {C1F400A0-3F08-11d3-9F0B-006008039E37}


Вот здесь описан способ, как можно создавать экземпляры этого класса и работать с ними:
http://www.vbstreets.ru/VB/Articles/65974.aspx

Но в нашем случае экземпляр уже есть, его можно достать из read-only свойства grabberFilter.filter
Как действовать в этом случае? Понятно, что нужно начать как-то так:

Код: Выделить всё
  Dim pMe As Long
  Dim MyGuid As modOLECommon.Guid, tmpInterface As modOLECommon.Guid
  modOLECommon.CLSIDFromString StrConv(CLSID_SampleGrabber, vbUnicode), MyGuid
  modOLECommon.IIDFromString StrConv(IID_ISampleGrabber, vbUnicode), tmpInterface
  modOLECommon.CoCreateInstance MyGuid, 0, 1, tmpInterface, pMe


А дальше?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 29.05.2011 (Вс) 11:23

Alprog писал(а):Вот здесь описан способ, как можно создавать экземпляры этого класса и работать с ними:
http://www.vbstreets.ru/VB/Articles/65974.aspx

Это вообще анти-статья. VB прекрасно работает с объектами, не поддерживающими интерфейс IDispatch. Единственное, что нельзя сделать с объектом, не поддерживающим IDispatch, так это:
  • Вызвать его метод при помощи функции CallByName.
  • Присвоить ссылку на него переменной с типом «Object».

Мои разъяснения насчёт того, почему эта статья не полезна в практических целях, а скорее вредна, можно найти здесь.

Alprog писал(а):Как действовать в этом случае? Понятно, что нужно начать как-то так:

Код: Выделить всё
Dim pMe As Long
Dim MyGuid As modOLECommon.Guid, tmpInterface As modOLECommon.Guid
modOLECommon.CLSIDFromString StrConv(CLSID_SampleGrabber, vbUnicode), MyGuid
modOLECommon.IIDFromString StrConv(IID_ISampleGrabber, vbUnicode), tmpInterface
modOLECommon.CoCreateInstance MyGuid, 0, 1, tmpInterface, pMe
А дальше?


Совершенно не нужно так, хотя и можно. Нужно объявить интересующие классы и интерфейсы в TLB. Хотя, скорее всего, TLB, в которой всё это уже объявленно, уже есть где-то.

Затем нужно сделать просто
Код: Выделить всё
Dim sg As ISimpleGrabber
Set sg = New SampleGrabber
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 29.05.2011 (Вс) 14:00

Хотя, скорее всего, TLB, в которой всё это уже объявленно, уже есть где-то.


Огромное спасибо! Действительно, описание интерфейсов ISampleGrabber и ISampleGrabberCB обнаружено в файлах qedit.h и qedit.idl.
Таким образом, достаточно подключить в Reference qedit.dll

Правда, место ISampleGrabber в VB попадает объект SampleGrabber; из-за чего я искал не то, что надо, и потратил пару часов пытаясь скомпилировать idl самостоятельно. Но тут уж я сам дурак :)

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 29.05.2011 (Вс) 15:27

Теперь у меня есть объект SampleGrabber. Его методы:

Код: Выделить всё
Sub GetConnectedMediaType(pType As _AMMediaType)
Sub GetCurrentBuffer(pBufferSize As Long, pBuffer As Long)
Function GetCurrentSample() As IMediaSample
Sub SetBufferSamples(BufferThem As Long)
Sub SetCallback(pCallback As ISampleGrabberCB, WhichMethodToCallback As Long)
Sub SetMediaType(pType As _AMMediaType)
Sub SetOneShot(OneShot As Long)


Это соответствует методам, описанным в MSDN:
http://msdn.microsoft.com/en-us/library ... 84(v=vs.85).aspx

Но вызвать у меня получилось только функцию SetOneShot. Как и положено, после неё граф отыгрывает один семпл и останавливается.
С остальными вызовами проблемы.

1. GetConnectedMediaType и SetMediaType приводят к ошибке "Variable uses an Automation type not supported in Visual Basic"
При этом ObjectBrowser при попытке посмотреть на этот _AMMediaType сообщает, что он hidden.

2. GetCurrentBuffer пробовал использовать так:

Код: Выделить всё
  Dim BufferSize As Long, Buffer As Long
  Dim pBufferSize As Long, pBuffer As Long
  BufferSize = 4
  pBufferSize = VarPtr(BufferSize)
  pBuffer = VarPtr(Buffer)
  grabber.GetCurrentBuffer pBufferSize, pBuffer


Но получаю ошибку "Invalide procedure call or argument".

---

Этим интерфейсом вообще можно пользоваться из VB?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Mikle » 29.05.2011 (Вс) 17:11

В тему не вникал, но ты уверен, что так:
Код: Выделить всё
Sub SetMediaType(pType As _AMMediaType)

А не так:
Код: Выделить всё
Sub SetMediaType(ByVal pType As _AMMediaType)

Просто само имя "pType" подразумевает, что это указатель, передавая его ByRef, мы передаём указатель на указатель, хотя это возможно.
Кроме того, раз это указатель - его тип должен быть As Long.
Повторяю, тему не изучал, просто подозрительно выглядят декларации.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 29.05.2011 (Вс) 17:16

Декларации я скопировал из Object Browser, так что уверен.

Может быть, нужно работу с этим объектом завернуть в dll на с++?
Хотя, конечно, не хочется прибегать к таким мерам.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 29.05.2011 (Вс) 17:35

Alprog писал(а):Правда, место ISampleGrabber в VB попадает объект SampleGrabber; из-за чего я искал не то, что надо, и потратил пару часов пытаясь скомпилировать idl самостоятельно. Но тут уж я сам дурак :)


Это разные вещи. Интерфейс и co-класс. В Dim As должен всплывать только интерфейс, в New xxx — только класс.

Alprog писал(а):Декларации я скопировал из Object Browser, так что уверен.

Object Browser — худший советчик, он нигде не показывает ByRef/ByVal для внешних сущностей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 31.05.2011 (Вт) 16:54

Оказалось, что интерфейс DirectShow для VB только для базовых функций.
Народ обычно выкручивается тем, что работу с нужным фильтром обворачивает в DLL на С++.

Я же, наверное, тогда вообще всё на С++ напишу.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 31.05.2011 (Вт) 17:05

Alprog писал(а):Народ обычно выкручивается тем, что работу с нужным фильтром обворачивает в DLL на С++.

Чем именно обусловлена необходимость привлекать С++?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение BV » 31.05.2011 (Вт) 17:22

Alprog писал(а):Оказалось, что интерфейс DirectShow для VB только для базовых функций.

Скорее, он описан для VB только для базовых функций

Проще с DShow работать на C++
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 31.05.2011 (Вт) 17:39

Скорее, он описан для VB только для базовых функций

Мне казалось, я тоже самое сказал.

Чем именно обусловлена необходимость привлекать С++?

Нет нормального интерфейса. Пользоваться этим или описывать интерфейс самому - для меня сложно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 31.05.2011 (Вт) 17:40

Alprog писал(а):Нет нормального интерфейса.

Речь о COM-интерфейсе?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 31.05.2011 (Вт) 18:25

Речь о COM-интерфейсе?

Да. Собственно, в 4-ом сообщении описана проблема, оставшаяся нерешённой (фильтр SampleGrabber).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 31.05.2011 (Вт) 19:50

Если нет описания интерфейса (вообще), то ты и в Си/Си++ ничего не сможешь сделать без самостоятельного написания описания. Но если есть описания для С/С++ (вроде h-файлов), то переделать это описание в IDL — крайне просто.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 01.06.2011 (Ср) 4:19

Я нашёл:
- qedit.h с описанием интерфейса;
- qedit.idl (вроде бы, то же самое описание);
- qedit.dll (при подключении появляется объект SampleGrabber, которым пользоваться не получается. ISampleGrabber не появляется).

Пытался qedit.idl скомпилировать с помощью MkTypLib, но он ругается.
Дома попробую ещё с помощью Midl.exe

Правильно ли я делаю? Не будет ли полученная TLB как-нибудь конфликтовать с объявлениями из DLL?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 01.06.2011 (Ср) 12:34

Alprog писал(а):Пытался qedit.idl скомпилировать с помощью MkTypLib, но он ругается.

MkTypLib стар и несовместим с MIDL-ом. Поэтому если idl создан для MIDL-а, не удивительно.

Alprog писал(а):Не будет ли полученная TLB как-нибудь конфликтовать с объявлениями из DLL?

А не надо вообще подключать DLL в референсах. Если всё необходимое будет в твоей TLB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 01.06.2011 (Ср) 15:01

Очень много всего за собой этой idl-файл потащил. Но, кое-как, после указания всех путей, TLB скомпилировался.
Я его даже зарегистрировал с помощью regtlibv12.exe (Windows7, x64) - пишет, что successful.

qedit.zip


Когда добавляю TLB в Reference - ошибок нет, но в список ничего не добавляется.
Никаких новых интерфейсов доступно тоже не становится.

Как проверить корректность получившейся библиотеки?
Может как-то связано с версией SDK, midl'а или ОС (x86/x64)?
У вас нет доступа для просмотра вложений в этом сообщении.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 01.06.2011 (Ср) 15:19

Alprog писал(а):Когда добавляю TLB в Reference - ошибок нет, но в список ничего не добавляется.

Это потому, что LIBID твоей созданной библиотеки совпадает с LIBID-ом библиотеки вшитой в %systemroot%\system32\qedit.dll. Поэтому она фактически не регистрируется и не добавляется.

Я сейчас посмотрел: в qedit.dll (не путать с tlb) есть и ко-классы и интерфейсы. Так чем тебя встроенная в dll-ку tlb-шка не устроила? Если всё-таки чем-то не устроила (вспоминаю, что там использованы несовместимые типы), то просто задай своей tlb-шке новый уникальный LIBID, не забыв исправить все те конфликтные типы, которые тебе не давали покоя («Variable uses an Automation type not supported ...»).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 01.06.2011 (Ср) 16:36

просто задай своей tlb-шке новый уникальный LIBID

Сработало. Полученный интерфейс полностью совпадает с тем, что добавляется из dll.

не забыв исправить все те конфликтные типы

Каким образом? Нашёл описание AM_MEDIA_TYPE в objmedia.idl, добавил его в qedit.idl - ничего не изменилось.

Но проблемы не только с конфликтными типами. Вот, например, казалось бы, простая функция:

Код: Выделить всё
Sub GetCurrentBuffer(pBufferSize As Long, pBuffer As Long)

что соответсвует

Код: Выделить всё
HRESULT GetCurrentBuffer(
  [in, out]  long *pBufferSize,
  [out]      long *pBuffer
);


pBufferSize [in, out]
Pointer to the size of the buffer. If pBuffer is NULL, this parameter receives the required buffer size, in bytes. If pBuffer is not NULL, set this parameter equal to the size of the buffer, in bytes. On output, the parameter receives the number of bytes that were copied into the buffer. This value might be smaller than the size of the buffer.

pBuffer [out]
Pointer to an array of bytes of size pBufferSize, or NULL. If this parameter is not NULL, the current buffer is copied into the array. If this parameter is NULL, the pBufferSize parameter receives the required buffer size.


Пытаюсь использовать так:

Код: Выделить всё
  Dim BufferSize As Long, Buffer As Long
  Dim pBufferSize As Long, pBuffer As Long
  BufferSize = 4
  pBufferSize = VarPtr(BufferSize)
  pBuffer = VarPtr(Buffer)
  grabber.GetCurrentBuffer pBufferSize, pBuffer


Но получаю ошибку "Invalide procedure call or argument".

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 01.06.2011 (Ср) 16:42

Alprog писал(а):Каким образом? Нашёл описание AM_MEDIA_TYPE в objmedia.idl, добавил его в qedit.idl - ничего не изменилось.

Ещё бы. Нужно исправлять кривые члены, а не повторно добавлять описание типа.

Alprog писал(а):Но проблемы не только с конфликтными типами. Вот, например, казалось бы, простая функция:

А это просто прямой твой косяк. Не нужно никаких VarPtr, потому что у тебя типы — ByRef.

Но даже если убрать VarPtr, у тебя просто неправильный код.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 01.06.2011 (Ср) 16:59

Собственно, из-за того, что нехватает знаний, как с этим работать на VB, я и собирался писать на С++.
Там, по крайней мере, понятно в какую функцию какой тип слать + есть документация и примеры.

у тебя просто неправильный код

Что мне надо знать/почитать, чтобы написать правильный код?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 01.06.2011 (Ср) 17:10

Alprog писал(а):Собственно, из-за того, что нехватает знаний, как с этим работать на VB, я и собирался писать на С++.

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

Alprog писал(а):Что мне надо знать/почитать, чтобы написать правильный код?

Да собственно тот кусочек на английском, который ты привёл.

Ты должен объявить второй параметр указанного метода As Any. Для этого в IDL нужно заменить long* на void*.

Затем в VB ты сначала должен вызват метода так:
Код: Выделить всё
GetCurrentBuffer(lSizeOfBuffer, ByVal 0&)

чтобы метод записал в переменную lSizeOfBuffer размер буфера, который необходимо ему предоставить. Затем ты должен выделить буфер указанного размера любым удобным для тебя способом. Например ReDim-ингом динамического массива. Затем ты должен вызвать GetCurrentBuffer ещё раз, первым параметром опять же lSizeOfBuffer, которая будет содержать фактический размер предоставленного буфера, а вторым параметром — ссылку на начало буфера (если для выделения памяти под буфера использовался дин. массив, то нужно передать ссылку на первый элемент).

Это одинаково актуально для абсолютного любого языка. Если ты этого не понимаешь, то ты и на С++ напишешь неправильный код.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 02.06.2011 (Чт) 11:08

На с++ всё понятно из описания, а в VB появляются дополнительные вопросы, вроде "как передать NULL?", "что соответствует указателю на long?"

И тем более не догадался бы, что:
в IDL нужно заменить long* на void*


Попробовал заменить: в описании метода появилось Any, но при вызове всё равно Run-Time Error 5.
Может быть, нельзя дёргать GetCurrentBuffer до SetMediaType.
Попробую написать то же самое на плюсах (убедиться, что правильно обращаюсь с объектом), а потом уже буду думать о том, как перенести в VB.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 02.06.2011 (Чт) 19:03

Попробую написать то же самое на плюсах (убедиться, что правильно обращаюсь с объектом)

Написал примерно то же самое на С++.
Обращался я с объектом неправильно (забыл включить буферизацию), но я получил соответствующую ошибку и всё поправил.
Внёс эквивалентные изменения в VB - не помогло.

Вообщем, для этой задачи буду использовать Си++. Вносить изменения в idl-файлы DirectShow - не для средних умов.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 02.06.2011 (Чт) 20:05

Alprog писал(а):Вообщем, для этой задачи буду использовать Си++. Вносить изменения в idl-файлы DirectShow - не для средних умов.

Ну какая-же это глупость. Всё равно что человек получил клавиатуру с раскладкой Дворака, но он не знает эту раскладку, и, внимание, предпочитает набирать текст замыканием проводков. Типа, проводки я уже умею замыкать, хоть это куда сложнее, чем просто нажимать на клавиши, и вообще небезопасно, а вот новую раскладку учить — не для средних умов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 03.06.2011 (Пт) 14:38

Странная аналогия. В моём представлении:

VB - это QWERTY-клавиатура - удобное средство, к которому ты привык и работаешь с ним бегло, вслепую.
С++ - это Дворак-клавиатура - средство, которое, вроде бы, считается лучше, но ты работаешь с ним медленно, постоянно подсматриваешь в подсказки.

И вот мне нужно набрать текст на системе, заточенной только под Дворак-клавиатуру. И у меня есть выбор:
- Смириться и использовать то, что здесь общепринято - Дворак-клавиатуру (С++).
- Подсоединить QWERTY-клавиатуру (VB), предварительно перезамкнув контакты так, чтобы она стала вести себя так, как надо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 03.06.2011 (Пт) 14:55

Alprog писал(а):В моём представлении:

VB - это QWERTY-клавиатура - удобное средство, к которому ты привык и работаешь с ним бегло, вслепую.
С++ - это Дворак-клавиатура - средство, которое, вроде бы, считается лучше, но ты работаешь с ним медленно, постоянно подсматриваешь в подсказки.

Вот нет. Это просто две разных раскладки, но это сопоставимые и одноуровневые вещи. А VB и С++ это несопоставимые и разноуровневые. И суть в том, что COM для VB — родная стихия, и всё притёрто. А в С++ это просто один из тысячи допустимых к выделыванию трюков. И ничего по сравнению с VB конкретно в данном деле С++ нет даст, кроме возможности оступиться и всё испортить. Ни-че-го нового, хорошего, позитивного.

Но человек говорит: выбираю язык, в котором есть тысяча вариантов незаметно для самого себя сделать что-то не так, вместо того, чтобы выучить одно—два простых правила в специально-для-этих-дел-созданном языке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Alprog » 03.06.2011 (Пт) 18:23

COM для VB — родная стихия

Верно. Но для DirectShow родная стихия - Си++. Документация, примеры, рабочие хедеры - бери и пользуйся.
А на VB без дополнительных приседаний не обойтись. И найти информацию о том, какие приседания нужно делать, лично мне сходу не удалось.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение Хакер » 03.06.2011 (Пт) 18:30

Alprog писал(а):А на VB без дополнительных приседаний не обойтись. И найти информацию о том, какие приседания нужно делать, лично мне сходу не удалось.

А ты только готовое можешь использовать? Самому думать — никак?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Визуализация музыки (DirectShow, IUnknown)

Сообщение BV » 04.06.2011 (Сб) 13:39

Хакер, существуют другие в жизни радости, кроме как подвязывание костылей к VB6. Если бы проблема упиралась в один-два интерфейса, тогда да, возможно, было бы проще их выдернуть из tlb'шки/idl'ки DShow и оформить отдельно, с учетом ole-a ограничений. А товарищ работает плотно с DShow, и затраты на описание интерфейсов могут быть соизмеримы, если не превышать затраты на переход на C++

Автор, возможно, тебя заинтересует мой проект: http://code.google.com/p/easybar/source/checkout
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

След.

Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList