crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> BASS, Qt и CALLBACK функция
urandom
  опции профиля:
сообщение 28.1.2012, 14:18
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.11.2011
Пользователь №: 2983

Спасибо сказали: 1 раз(а)




Репутация:   0  


Возможно, те кто работал с BASS в Qt уже сталкивались с подобной проблемой.
В общем мне надо сохранить воспроизводимый BASS'ом трек. Для этого у BASS есть CALLBACK функция. В ее параметрах BASS передает кусками трек, который в последствии мне необходимо сохранить в файл.
Проблема заключается в том, что мне необходимо использовать эту функцию непосредственно внутри класса, а BASS требует сделать ее статической. Т.е.:
static void CALLBACK downproc(const void *buffer, DWORD length, void *user);
...
BASS_StreamCreateURL(url.toAscii(), 0, 0, &downproc, 0);

Все работает, но я не могу работать с методами и переменными класса.

void CALLBACK downproc(const void *buffer, DWORD length, void *user);
...
BASS_StreamCreateURL(url.toAscii(), 0, 0, &BASS::downproc, 0);

Не работает, ибо:
Цитата
cannot convert 'void (BASS::*)(const void*, DWORD, void*)' to 'void (*)(const void*, DWORD, void*) ...


Можно ли заставить BASS работать с нестатической функцией?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.1.2012, 14:41
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


class MyClass
{
public:

    void setCallback( const QUrlg &url )
    {
        BASS_StreamCreateURL( url.toAscii(), 0, 0, &downproc, this );
    }

protected:
    static void CALLBACK downproc(const void *buffer, DWORD length, void *user)
    {
        Q_ASSERT( user );
        MyClass *ptr = static_cast<MyClass*>( user );
        // ptr указывает на объект класса
    }
};

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
urandom
  опции профиля:
сообщение 28.1.2012, 21:20
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.11.2011
Пользователь №: 2983

Спасибо сказали: 1 раз(а)




Репутация:   0  


void BASS::downproc(const void *buffer, DWORD length, void *user)
{
    Q_UNUSED(length);
    Q_ASSERT(user);

    BASS *parent = static_cast<BASS *>(user);

    if (!parent->trackFile->isOpen()) {
        parent->trackFile->setFileName(parent->trackFileName);
        parent->trackFile->open(QFile::WriteOnly);
    }

    if (!buffer) {
        parent->trackFile->close();
    } else {
        QDataStream stream(parent->trackFile);
        stream << buffer;
    }

}


Вот такой вот ужос вышел х)
Спасибо)

Сообщение отредактировал urandom - 28.1.2012, 21:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.1.2012, 22:22
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


И работает?
А почему ты от length отказался?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
urandom
  опции профиля:
сообщение 28.1.2012, 22:26
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.11.2011
Пользователь №: 2983

Спасибо сказали: 1 раз(а)




Репутация:   0  


эмм, а не должно? х)
Работает, причем отлично. Зачем мне там length?..

Сообщение отредактировал urandom - 28.1.2012, 22:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.1.2012, 22:31
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(urandom @ 28.1.2012, 23:26) *
Работает, причем отлично. Зачем мне там length?..

Ну он же тебе не строки передает, а бинарные данные. И length, как раз, показывает длину этих данных. Нет?

Сообщение отредактировал BRE - 28.1.2012, 22:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
urandom
  опции профиля:
сообщение 28.1.2012, 22:42
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.11.2011
Пользователь №: 2983

Спасибо сказали: 1 раз(а)




Репутация:   0  


Да, да, тупанул ><
Только как мне тогда записать данные в QFile?..

parent->trackFile->write((char*)buffer, length);

так?.

Сообщение отредактировал urandom - 28.1.2012, 22:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.1.2012, 22:52
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Можно так, а можно используя указатель и длину создать QByteArray, ну и дальше... хочешь через write, хочешь через QDataStream.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
urandom
  опции профиля:
сообщение 28.1.2012, 22:56
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.11.2011
Пользователь №: 2983

Спасибо сказали: 1 раз(а)




Репутация:   0  


Еще раз спасибо)
Думаю, весь проект поверг бы вас в ужас..

Пошел учить матчасть ._.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2020, 2:24