powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись аудио с микрофона. bass.dll
17 сообщений из 17, страница 1 из 1
Запись аудио с микрофона. bass.dll
    #38967309
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Пытаюсь заюзать bass.dll для записи аудио с микрофона. Получился рабочий прототип, сделанный по примерам, сделан на C++ builder - сделан на скорую руку, но работает и это хорошо.
А теперь вот что плохо: я все перенес на Visual Studio 2012 (Visual C++).
Почти все заработало. Все, что связано со звуком - я вынес в отдельный класс. И в этом классе есть метод StartRecording:
Версия - прототип, когда все было в C++ builder внутри формы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
void Sound::StartRecording()
{

	lastErrorCode = 0;
	WAVEFORMATEX *wf;
    if (recbuf)
    {
	  BASS_StreamFree(chan);
	  chan=0;
	  free(recbuf);
	  recbuf=NULL;
      BASS_Free();
    }
    recbuf=(char*)malloc(BUFSTEP);
    reclen=44;
    memcpy(recbuf,"RIFF\0\0\0\0WAVEfmt \20\0\0\0",20);
    memcpy(recbuf+36,"data\0\0\0\0",8);
    wf=(WAVEFORMATEX*)(recbuf+20);
    wf->wFormatTag=1;
    wf->nChannels=CHANS;
    wf->wBitsPerSample=16;
    wf->nSamplesPerSec=FREQ;
    wf->nBlockAlign=wf->nChannels*wf->wBitsPerSample/8;
    wf->nAvgBytesPerSec=wf->nSamplesPerSec*wf->nBlockAlign;
    rchan=BASS_RecordStart(FREQ,CHANS,0, RecordingCallback,0);
	if (!rchan)
	{
	  free(recbuf);
	  lastErrorCode = -2;
	  lastErrorMsg = "Запись не произведена";
	  recbuf=0;
	  return;
	}
}



RecordingCallback
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
BOOL CALLBACK RecordingCallback(HRECORD handle, const void *buffer, DWORD length, void *user)
{
 // ASSERT(1==2);  
	if ((reclen%BUFSTEP)+length>=BUFSTEP) {
        recbuf=(char*)realloc(recbuf,((reclen+length)/BUFSTEP+1)*BUFSTEP);
		if (!recbuf)
		{
		  rchan=0;
		  lastErrorCode = -3;
		  lastErrorMsg = "Выход за предел памяти";
		  return false;
		}
	}
    memcpy(recbuf+reclen,buffer,length);
    reclen+=length;
    return true;
}


И это все работало. Как только я все вынес в отдельный класс и в окне диалога по кнопке создаю объект этого класса и вызываю метод класса StartRecording - не вызывается никак RecordingCallback, что объяснимо. Как тогда правильно передать указатель на эту функцию? Примеры из справки по bass.dll почему-то не работают - там сделано так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
private RECORDPROC _myRecProc; // make it global, so that the GC can not remove it 
private int _byteswritten = 0;
private byte[] _recbuffer; // local recording buffer
...
if ( Bass.BASS_RecordInit(-1) )
{
  _myRecProc = new RECORDPROC(MyRecording);
  int recHandle = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, _myRecProc, IntPtr.Zero);
  ...
  // start recording
  Bass.BASS_ChannelPlay(recHandle, false);
}
...
private bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)
{
  bool cont = true;
  if (length > 0 && buffer != IntPtr.Zero)
  {
    // increase the rec buffer as needed 
    if (_recbuffer == null || _recbuffer.Length < length)
      _recbuffer = new byte[length];
    // copy from managed to unmanaged memory
    Marshal.Copy(buffer, _recbuffer, 0, length);
    _byteswritten += length;
    // write to file
    ...
    // stop recording after a certain amout (just to demo) 
    if (_byteswritten > 800000)
      cont = false; // stop recording
  }
  return cont;
}


строчка _myRecProc = new RECORDPROC(MyRecording); не компилится, компилер считает, что:
error C2066: недопустимое приведение к типу функции
error C2659: =: функция в качестве левого операнда... Я пока еще мало знаю с++, поэтому с этим уже долго бодаюсь - как бы сделать все правильно - передать таки в функцию BASS_RecordStart в качестве параметра указатель на коллбэкфункцию?
Заранее спасибо за помощь!
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967323
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75передать таки в функцию BASS_RecordStart в качестве параметра указатель
на коллбэкфункцию?
Для начала - перестать пытаться запихать на место функции метод класса. Это две большие
разницы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967331
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovGaladriel75передать таки в функцию BASS_RecordStart в качестве параметра указатель
на коллбэкфункцию?
Для начала - перестать пытаться запихать на место функции метод класса. Это две большие
разницы.


А где здесь метод класса?
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967337
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75А где здесь метод класса?
А давно в С++ можно обычные функции объявлять private?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967342
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovGaladriel75А где здесь метод класса?
А давно в С++ можно обычные функции объявлять private?..


можно более конкретно - в соответствии с темой топика. Зачем тратить время и не по теме лить воду и выяснять что в с++ можно, а что нельзя. Если нет возможности помочь, зачем лезть и всякую лабуду писать...
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967344
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75можно более конкретно - в соответствии с темой топика.
В соответствии с темой: new убери вместе с самой _MyRecProc. MyRecording объяви как надо и
используй напрямую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967353
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovGaladriel75можно более конкретно - в соответствии с темой топика.
В соответствии с темой: new убери вместе с самой _MyRecProc. MyRecording объяви как надо и
используй напрямую.


все так и было, когда все работало в одном классе - в C++ builder - как обработчик клика кнопки. А как вынес в отдельный класс - функция просто перестала вызываться.
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967355
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75Dimitry Sibiryakovпропущено...

В соответствии с темой: new убери вместе с самой _MyRecProc. MyRecording объяви как надо и
используй напрямую.


все так и было, когда все работало в одном классе - в C++ builder - как обработчик клика кнопки. А как вынес в отдельный класс - функция просто перестала вызываться.

вот кусок из рабочей билдеровской проги:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
//---------------------------------------------------------------------------
BOOL CALLBACK RecordingCallback(HRECORD handle, const void *buffer, DWORD length, void *user)
{
    if ((reclen%BUFSTEP)+length>=BUFSTEP) {
        recbuf=(char*)realloc(recbuf,((reclen+length)/BUFSTEP+1)*BUFSTEP);
        if (!recbuf) {
            rchan=0;
            ShowMessage("Выход за предел памяти");
            return false;
        }
    }
    memcpy(recbuf+reclen,buffer,length);
    reclen+=length;
    return true;
}

void TForm1::StartRecording()
{
    WAVEFORMATEX *wf;
    if (recbuf)
    {
        BASS_StreamFree(chan);
        chan=0;
        free(recbuf);
        recbuf=NULL;
        BASS_Free();
    }
    recbuf=(char*)malloc(BUFSTEP);
    reclen=44;
    memcpy(recbuf,"RIFF\0\0\0\0WAVEfmt \20\0\0\0",20);
    memcpy(recbuf+36,"data\0\0\0\0",8);
    wf=(WAVEFORMATEX*)(recbuf+20);
    wf->wFormatTag=1;
    wf->nChannels=CHANS;
    wf->wBitsPerSample=16;
    wf->nSamplesPerSec=FREQ;
    wf->nBlockAlign=wf->nChannels*wf->wBitsPerSample/8;
    wf->nAvgBytesPerSec=wf->nSamplesPerSec*wf->nBlockAlign;
	Form1->Button2->Enabled=true;
    rchan=BASS_RecordStart(FREQ,CHANS,0,RecordingCallback,0);
    if (!rchan) {
        free(recbuf);
        ShowMessage("Запись не произведена!");
		Form1->Button2->Enabled=false;
        recbuf=0;
        return;
	}
}
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967358
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75А как вынес в отдельный класс - функция просто перестала вызываться.
Ты в самом деле не видишь разницы между
Код: sql
1.
2.
BOOL CALLBACK RecordingCallback(HRECORD handle, const void *buffer, DWORD length, 
void *user)


и
Код: sql
1.
bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)


???
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967363
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovGaladriel75А как вынес в отдельный класс - функция просто перестала вызываться.
Ты в самом деле не видишь разницы между
Код: sql
1.
2.
BOOL CALLBACK RecordingCallback(HRECORD handle, const void *buffer, DWORD length, 
void *user)


и
Код: sql
1.
bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)


???



про MyRecording надо забыть! - она - из совсем другого примера! Мой случай: BOOL CALLBACK RecordingCallback(HRECORD handle, const void *buffer, DWORD length,
void *user) -и дергать надо эту и только эту функцию!
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967364
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вызываться перестала именно RecordingCallback - билдеровский вариаент в пошаговой отладке - вход в функцию есть. в студии - никаких заходов нет...
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967381
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75вот кусок из рабочей билдеровской проги:
Ну и зачем приводить кусок из рабочей проги, когда спрашиваешь почему не работает совсем
другая?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967437
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Topic можно закрывать. Разобрался во всем сам и все сделал. И еще раз убедился - если задать вопрос, а на него вместо ответа будет другой вопрос в стиле "а зачем?", то это наш форум! Вот этот топик - золотой пример - на конкретный вопрос - ни одного ответа, но букв очень много. Видимо есть люди, которые сами толком-то ничего не знают, но просто поговорить очень хочется...
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967450
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, значит, ты вопрос "вот этот код работает, а мой, совсем другой, нет, почему?"
называешь "конкретным". Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967477
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovАга, значит, ты вопрос "вот этот код работает, а мой, совсем другой, нет, почему?"
называешь "конкретным". Ню-ню...

Оба кода - мои. И я их их делал оба. Один - в с++ buildеr. другой - в студии
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967478
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovАга, значит, ты вопрос "вот этот код работает, а мой, совсем другой, нет, почему?"
называешь "конкретным". Ню-ню...

Мой вопрос таков: " Как тогда правильно передать указатель на эту функцию?". Вы увидели: "вот этот код работает, а мой, совсем другой, нет, почему?" . Вы умеете читать?
...
Рейтинг: 0 / 0
Запись аудио с микрофона. bass.dll
    #38967494
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75,

код надо приводить целиком, а не какие-то огрызки.
кусок кода должен быть компилируем, хотя бы потенциально.

Когда тебе дают полезные советы, надо слушать, а не обижаться.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись аудио с микрофона. bass.dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]