I want to record from one device, do some processing, and play from another. Currently these are in the same thread.
I'm doing:
// input is an audio device
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion())!=BASSVERSION) {
Error("An incorrect version of BASS was loaded");
return 1;
}
/*
if (!BASS_RecordSetDevice(rec_dn)) {
sprintf_s(message,"Failed to set input audio device. Error: %d\n",BASS_ErrorGetCode());
MessageBox(NULL, TEXT((LPCSTR)message), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
return 1;
}
*/
if (!BASS_RecordInit(rec_dn)){
MessageBox(NULL, TEXT("Could not initialize input audio device"), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
return 1;
}
if (!BASS_RecordGetDeviceInfo(rec_dn, &rec_device_info)) {
MessageBox(NULL, TEXT("Could not get info for input audio device"), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
return 1;
}
rec_handle = BASS_RecordStart(44100, 2, BASS_SAMPLE_FLOAT,NULL,0); //NULL or RecordingCallback
if (!rec_handle) {
MessageBox(NULL, TEXT("Could not start input device"), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
return 1;
}
(Note that BASS_RecordSetDevice fails with error 23 and is commented out because it's not used in rectest anyway)
with device 0
Available Audio Input Devices:
0: Line 1 (Virtual Audio Cable)
1: Microphone (Saffire Audio)
2: U46 Ch12 (U46 Audio driver)
3: U46 Ch34 (U46 Audio driver)
4: U46 Ch56 (U46 Audio driver)
5: U46 Multi-6 ch (U46 Audio drive
Available Audio Output Devices:
-1: default device
0: No sound
1: Line 1 (Virtual Audio Cable)
2: U46 Ch12 (U46 Audio driver)
3: U46 Ch56 (U46 Audio driver)
4: Speakers (U46 Audio driver)
5: Speakers (Saffire Audio)
6: Realtek Digital Output (Realtek High Definition Audio)
7: U46 Ch34 (U46 Audio driver)
100: ASIO ASIO 2.0 - ESI U46
101: ASIO ASIO Avid Driver
102: ASIO ASIO DirectX Full Duplex Driver
103: ASIO ASIO4ALL v2
104: ASIO Generic Low Latency ASIO Driver
105: ASIO JackRouter
106: ASIO ASIO Saffire
And trying to play back with device 4 (or other).
When I try to use a non ASIO device BASS_StreamCreate fails with error -1 (failed to start 16bit stream popup):
When I try to use an ASIO device, depending on the device, I get Error (0) can't initialize device, or a crash in the driver. All the playback code is working with input from a file (vs. recording)
if ( dn < 100 ) {
//if (floatable) BASS_StreamFree(floatable); // floating-point channels are supported!
if (floatable) {
if (chan=BASS_StreamCreate(sfinfo.samplerate,6,BASS_SAMPLE_FLOAT,STREAMPROC_PUSH,user)) {
BASS_ChannelGetInfo(chan,&bci);
y = initial_y + 5;
SetPos(0,y);
printf("%s\rStarted float stream with %d inputs and %d outputs\r",blankln,bci.chans, bi.speakers);
}
else {
sprintf_s(message,"Failed to start float stream. Error: %d\n",BASS_ErrorGetCode());
MessageBox(NULL, TEXT((LPCSTR)message), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
//printf("samplerate: %d channels: %d\n",sfinfo.samplerate, sfinfo.channels);
return 1;
}
}
else {
if (chan=BASS_StreamCreate(sfinfo.samplerate, sfinfo.channels,0,STREAMPROC_PUSH,user)) {
BASS_ChannelGetInfo(chan,&bci);
y = initial_y + 5;
SetPos(0,y);
printf("%s\rStarted 16 bit stream with %d inputs and %d outputs\r",blankln,bci.chans, bi.speakers);
}
else {
sprintf_s(message,"Failed to start 16 bit stream. Error: %d\n",BASS_ErrorGetCode());
MessageBox(NULL, TEXT((LPCSTR)message), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
//printf("samplerate: %d channels: %d\n",sfinfo.samplerate, sfinfo.channels);
return 1;
}
}
}
else {
floatable = 1; //Assume all ASIO drivers are floatable
if (floatable != 0) {
if (chan=BASS_StreamCreate(sfinfo.samplerate, sfinfo.channels,BASS_SAMPLE_FLOAT|BASS_STREAM_DECODE,STREAMPROC_PUSH,user)) {
BASS_ChannelGetInfo(chan,&bci);
y = initial_y + 5;
SetPos(0,y);
printf("%s\rStarted float stream with %d inputs and %d outputs\r",blankln,bci.chans, asio_info.outputs);
}
else {
sprintf_s(message,"Failed to start float stream. Error: %d ASIO Error: %d\n",BASS_ErrorGetCode(),BASS_ASIO_ErrorGetCode());
MessageBox(NULL, TEXT((LPCSTR)message), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
//printf("samplerate: %d channels: %d\n",sfinfo.samplerate, sfinfo.channels);
return 1;
}
}
else {
if (chan=BASS_StreamCreate(sfinfo.samplerate, sfinfo.channels,BASS_STREAM_DECODE,STREAMPROC_PUSH,user)) {
BASS_ChannelGetInfo(chan,&bci);
y = initial_y + 5;
SetPos(0,y);
printf("%s\rStarted 16 bit stream with %d inputs and %d outputs\r",blankln,bci.chans, asio_info.outputs);
}
else {
sprintf_s(message,"Failed to start 16 bit stream. Error: %d ASIO Error: %d\n",BASS_ErrorGetCode(),BASS_ASIO_ErrorGetCode());
MessageBox(NULL, TEXT((LPCSTR)message), TEXT("SpecCL"), MB_OK|MB_ICONEXCLAMATION);
//printf("samplerate: %d channels: %d\n",sfinfo.samplerate, sfinfo.channels);
return 1;
}
}
}
Do all the recording calls need to be in their own thread?
If so does calling BASS_ChannelGetData(rec_handle,inbuf,BASS_DATA_FLOAT) also have to be in the recording thread?
Right now I'm trying to do this:
while((sampsread = (!live)?sf_read_float(insndfile,inbuf,inbuflen):BASS_ChannelGetData(rec_handle,inbuf,BASS_DATA_FLOAT)) > 0){
where "live" is the switch between file based input (via libsndfile) and bass recording input.
Thanks
Z