Не получается получить список фильтров с пом. acmFormatTagEn
От: LordAhriman  
Дата: 24.04.06 18:34
Оценка:
Вот уже который день парюсь с такой задачей. У меня есть рекордер, который работает с WMM и записывает звук с микрофона (для примера). Здесь всё ок. Сохраняется, читается, отображается… Теперь нужно сжать этот звук. Стал использовать ACM. Вроде ничего. Но когда нужно было установить, какие драйверы (кодеки) поддерживают ТЕКУЩИЙ, выбранный пользователем формат записи… Короче – пока я это делаю выкидыванием “системного” окна с помощью acmFormatChoose. Но меня это не устраивает. Хочу иметь нормальный контрол, заполненный форматами. Стал юзать acmFormatTagEnum и acmFormatEnum. При вызове коллбэка происходит AV Бьюсь головой, ничего не могу понять. Ведь как-то же тот диалог получил ФОРМАТЫ? А почему я не могу?
Короче, если кто работал – поделитесь рабочим кодом, плиз, а то это такая, оказывается «магическая» тема – инфы очень мало. Такое ощущение, что никто с ACM не работал…

Если что – вот мой кусок кода:


BOOL CConvertHelper::IsSupports(HACMDRIVERID hadid,WAVEFORMATEX frmt){
    HACMDRIVER hdriver = NULL;
    if(MMSYSERR_NOERROR==acmDriverOpen(&hdriver,hadid,0)){
        ASSERT(hdriver);
    }else 
        return FALSE;
    
    ACMFORMATTAGDETAILS formatdet;
    memset((void*)&formatdet,0,sizeof(formatdet));
    formatdet.cbStruct = sizeof(formatdet);

    HINSTANCE hInst = GetModuleHandle(NULL);

    MMRESULT ret = acmFormatTagEnum(hdriver,&formatdet,
        (ACMFORMATTAGENUMCB)acmFormatTagEnumCallback,(DWORD_PTR)hInst,0);

    if(ret!=MMSYSERR_NOERROR){
        TraceError(ret);
    }

    // TODO:
    return TRUE;
}

BOOL CConvertHelper::acmFormatTagEnumCallback(HACMDRIVERID hadid,LPACMFORMATTAGDETAILS paftd,DWORD_PTR dwInstance,DWORD dwSupport){
    
        TRACE("");
    return TRUE;
}
Re: Не получается получить список фильтров с пом. acmFormatT
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.04.06 05:55
Оценка:
Здравствуйте, LordAhriman, Вы писали:

LA>При вызове коллбэка происходит AV


Подозреваю, что из-за того, что Вы насильственно приводите тип функции CConvertHelper::acmFormatTagEnumCallback к ACMFORMATTAGENUMCB. Значит, что-то в типах не совпадает — например, calling convention. А может, у Вас эта функция вообще нестатическая, хотя редкий компилятор согласится на такое преобразование. Не нужно насильственно приводить типы без крайней необходимости — это лишь добавляет возможных проблем.

Module handle в сallback-функцию передавать совершенно незачем — слово instance здесь обозначает произвольное значение, определяемое пользователем (например, указатель на некий уникальный экземпляр данных), а не тип HINSTANCE, который передается в ACMFORMATCHOOSE, чтобы обеспечить доступ к ресурсам модуля.

Кстати, зачем вручную приводить указатель к void * в memset? Это, как раз, делается автоматически и безопасно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Не получается получить список фильтров с пом. acmForm
От: Аноним  
Дата: 28.04.06 15:11
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, LordAhriman, Вы писали:


Евгений, здравствуйте. Если уж есть возможность писать в ФИДО — зачем сюда отвечаете? ?-) хотя там вопрос был в другом (я его, кстати, решил — косяк был в либе)

LA>>При вызове коллбэка происходит AV


ЕМ>Подозреваю, что из-за того, что Вы насильственно приводите тип функции CConvertHelper::acmFormatTagEnumCallback к ACMFORMATTAGENUMCB. Значит, что-то в типах не совпадает — например, calling convention. А может, у Вас эта функция вообще нестатическая, хотя редкий компилятор согласится на такое преобразование. Не нужно насильственно приводить типы без крайней необходимости — это лишь добавляет возможных проблем.


Нет. Проверял. Это первое о чем я подумал. Хотя фиг его знает — попробую заново. Спасибо за подсказку.

ЕМ>Module handle в сallback-функцию передавать совершенно незачем — слово instance здесь обозначает произвольное значение, определяемое пользователем (например, указатель на некий уникальный экземпляр данных), а не тип HINSTANCE, который передается в ACMFORMATCHOOSE, чтобы обеспечить доступ к ресурсам модуля.

не углядел. Хотя — ошибка же не в этом....

ЕМ>Кстати, зачем вручную приводить указатель к void * в memset? Это, как раз, делается автоматически и безопасно.

привычка.... ещё с Си осталась
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.