#include "MixerMicrophoneValue.h" #include #include #include #include #include #include namespace MixerMicrophoneValue_namespace { std::unordered_map map_componenttype; std::unordered_map map_controltype; const char *GetTextErrorMMSystem(int err) { const char *res = nullptr; switch(err) { case MMSYSERR_NOERROR :res="MMSYSERR_NOERROR";break; case MMSYSERR_ERROR :res="MMSYSERR_ERROR";break; case MMSYSERR_BADDEVICEID :res="MMSYSERR_BADDEVICEID";break; case MMSYSERR_NOTENABLED :res="MMSYSERR_NOTENABLED";break; case MMSYSERR_ALLOCATED :res="MMSYSERR_ALLOCATED";break; case MMSYSERR_INVALHANDLE :res="MMSYSERR_INVALHANDLE";break; case MMSYSERR_NODRIVER :res="MMSYSERR_NODRIVER";break; case MMSYSERR_NOMEM :res="MMSYSERR_NOMEM";break; case MMSYSERR_NOTSUPPORTED :res="MMSYSERR_NOTSUPPORTED";break; case MMSYSERR_BADERRNUM :res="MMSYSERR_BADERRNUM";break; case MMSYSERR_INVALFLAG :res="MMSYSERR_INVALFLAG";break; case MMSYSERR_INVALPARAM :res="MMSYSERR_INVALPARAM";break; case MMSYSERR_HANDLEBUSY :res="MMSYSERR_HANDLEBUSY";break; case MMSYSERR_INVALIDALIAS :res="MMSYSERR_INVALIDALIAS";break; case MMSYSERR_BADDB :res="MMSYSERR_BADDB";break; case MMSYSERR_KEYNOTFOUND :res="MMSYSERR_KEYNOTFOUND";break; case MMSYSERR_READERROR :res="MMSYSERR_READERROR";break; case MMSYSERR_WRITEERROR :res="MMSYSERR_WRITEERROR";break; case MMSYSERR_DELETEERROR :res="MMSYSERR_DELETEERROR";break; case MMSYSERR_VALNOTFOUND :res="MMSYSERR_VALNOTFOUND";break; case MMSYSERR_NODRIVERCB :res="MMSYSERR_NODRIVERCB";break; // case MMSYSERR_MOREDATA :res="MMSYSERR_MOREDATA ";break; case MIXERR_INVALCONTROL :res="MIXERR_INVALCONTROL";break; } return res; } void FillComponetAndControlTypeMessges() { map_componenttype.clear(); map_controltype.clear(); using namespace std; map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_DIGITAL,"MIXERLINE_COMPONENTTYPE_SRC_DIGITAL")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_LINE,"MIXERLINE_COMPONENTTYPE_SRC_LINE")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,"MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER,"MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC,"MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE,"MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER,"MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT,"MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY,"MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_ANALOG,"MIXERLINE_COMPONENTTYPE_SRC_ANALOG")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED,"MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_DIGITAL,"MIXERLINE_COMPONENTTYPE_DST_DIGITAL")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_LINE,"MIXERLINE_COMPONENTTYPE_DST_LINE")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_MONITOR,"MIXERLINE_COMPONENTTYPE_DST_MONITOR")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,"MIXERLINE_COMPONENTTYPE_DST_SPEAKERS")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_HEADPHONES,"MIXERLINE_COMPONENTTYPE_DST_HEADPHONES")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_TELEPHONE,"MIXERLINE_COMPONENTTYPE_DST_TELEPHONE")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_WAVEIN,"MIXERLINE_COMPONENTTYPE_DST_WAVEIN")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_VOICEIN,"MIXERLINE_COMPONENTTYPE_DST_VOICEIN")); map_componenttype.insert(pair(MIXERLINE_COMPONENTTYPE_DST_UNDEFINED,"MIXERLINE_COMPONENTTYPE_DST_UNDEFINED")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_BASS ,"MIXERCONTROL_CONTROLTYPE_BASS ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_EQUALIZER ,"MIXERCONTROL_CONTROLTYPE_EQUALIZER ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_FADER ,"MIXERCONTROL_CONTROLTYPE_FADER ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_TREBLE ,"MIXERCONTROL_CONTROLTYPE_TREBLE ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_VOLUME,"MIXERCONTROL_CONTROLTYPE_VOLUME")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MIXER ,"MIXERCONTROL_CONTROLTYPE_MIXER ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT ,"MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MUX ,"MIXERCONTROL_CONTROLTYPE_MUX ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_SINGLESELECT,"MIXERCONTROL_CONTROLTYPE_SINGLESELECT")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_BOOLEANMETER ,"MIXERCONTROL_CONTROLTYPE_BOOLEANMETER ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_PEAKMETER ,"MIXERCONTROL_CONTROLTYPE_PEAKMETER ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_SIGNEDMETER ,"MIXERCONTROL_CONTROLTYPE_SIGNEDMETER ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER,"MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_DECIBELS ,"MIXERCONTROL_CONTROLTYPE_DECIBELS ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_PERCENT ,"MIXERCONTROL_CONTROLTYPE_PERCENT ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_SIGNED ,"MIXERCONTROL_CONTROLTYPE_SIGNED ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_UNSIGNED,"MIXERCONTROL_CONTROLTYPE_UNSIGNED")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_PAN ,"MIXERCONTROL_CONTROLTYPE_PAN ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_QSOUNDPAN ,"MIXERCONTROL_CONTROLTYPE_QSOUNDPAN ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_SLIDER,"MIXERCONTROL_CONTROLTYPE_SLIDER")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_BOOLEAN ,"MIXERCONTROL_CONTROLTYPE_BOOLEAN ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_BUTTON,"MIXERCONTROL_CONTROLTYPE_BUTTON")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_LOUDNESS ,"MIXERCONTROL_CONTROLTYPE_LOUDNESS ")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MONO,"MIXERCONTROL_CONTROLTYPE_MONO")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MUTE,"MIXERCONTROL_CONTROLTYPE_MUTE")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_ONOFF,"MIXERCONTROL_CONTROLTYPE_ONOFF")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_STEREOENH,"MIXERCONTROL_CONTROLTYPE_STEREOENH")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MICROTIME,"MIXERCONTROL_CONTROLTYPE_MICROTIME")); map_controltype.insert(pair(MIXERCONTROL_CONTROLTYPE_MILLITIME,"MIXERCONTROL_CONTROLTYPE_MILLITIME")); } }; using namespace MixerMicrophoneValue_namespace; using namespace std; MixerMicrophoneValue::MixerMicrophoneValue(void) { flagLinkedToDeviceControl = false; defaultname.assign("default"); MixerMicrophoneValue_namespace::FillComponetAndControlTypeMessges(); } MixerMicrophoneValue::~MixerMicrophoneValue(void) { Release(); } const string &MixerMicrophoneValue::GetNameOfLinkedDevice() { return NameOfLinkedWaveIn; } void MixerMicrophoneValue::Release(void) { flagLinkedToDeviceControl=false; } int MixerMicrophoneValue::CheckDefaultInDevice(void) {//return 0 in success try { int res=0; std::string resstring; WAVEFORMATEX wf; HWAVEIN HWI; int SamplesPerSec=16000; int BitsPerSample=16; int channels=2; wf.wBitsPerSample=static_cast(BitsPerSample); wf.nAvgBytesPerSec=SamplesPerSec*BitsPerSample/8; wf.nChannels=static_cast(channels); wf.nSamplesPerSec=SamplesPerSec; wf.wFormatTag=WAVE_FORMAT_PCM; wf.nBlockAlign=channels*BitsPerSample/8; wf.cbSize=0; //Name of default device restoring by waveInOpen with parameter WAVE_MAPPER int resOfOpen = waveInOpen(&HWI,WAVE_MAPPER,&wf,NULL,NULL,CALLBACK_NULL); if(resOfOpen == MMSYSERR_NOERROR) { HMIXER mixerHandle; MMRESULT err = mixerOpen(&mixerHandle, (UINT)HWI, 0, 0, MIXER_OBJECTF_HWAVEIN); if(!err) { MIXERCAPSA mixcaps; if (!mixerGetDevCapsA((UINT)mixerHandle, &mixcaps, sizeof(MIXERCAPSA))) { //found resstring.assign(mixcaps.szPname); NameOfDefaultWaveIn=resstring; } mixerClose(mixerHandle); }else { cerr<<"CheckDefaultInDevice error: "< vector_NamePossibleTarget; int max_len=0; int targetdevice_num=-1; for (unsigned int i = 0; i < iNumDevs; i++) { if (!mixerGetDevCapsA(i, &mixcaps, sizeof(MIXERCAPSA))) { //check for ID of target WaveIn int len_name=strlen(mixcaps.szPname); auto pair_mismatch=std::mismatch(mixcaps.szPname,mixcaps.szPname+len_name,NameOfTargetWaveIn.begin(), NameOfTargetWaveIn.end()); int lenequal_1=std::distance(NameOfTargetWaveIn.begin(),pair_mismatch.second); if(lenequal_1>max_len) {//target - max distance of mismatch max_len=lenequal_1; targetdevice_num=i;//ID of possible target vector_NamePossibleTarget.resize(len_name); copy(mixcaps.szPname,mixcaps.szPname+len_name,vector_NamePossibleTarget.begin()); } //check for ID of default WaveIn auto pair_mismatch_default=std::mismatch(mixcaps.szPname,mixcaps.szPname+len_name,NameOfDefaultWaveIn.begin(), NameOfDefaultWaveIn.end()); size_t lenequal_default=std::distance(NameOfDefaultWaveIn.begin(),pair_mismatch_default.second); if(lenequal_default==NameOfDefaultWaveIn.length()) { numOfDefaultWaveIn=i;//ID of default } } } if(targetdevice_num>=0) {//target found ID_OfTargetWaveIn=targetdevice_num; NameOfLinkedWaveIn.assign(&(vector_NamePossibleTarget[0]),vector_NamePossibleTarget.size()); } else {//target not found - change target to deafult ID_OfTargetWaveIn=numOfDefaultWaveIn; NameOfLinkedWaveIn.assign(NameOfDefaultWaveIn); } flagLinkedToDeviceControl=true; LinkToMicrophone(); result=flagLinkedToDeviceControl?0:-1; return result; } catch (std::exception &e) { myDebug()<1) { MIXERCONTROLDETAILS_BOOLEAN mixBoolean[50]; MIXERCONTROLDETAILS_LISTTEXT mixList[50]; // flag_MUX=true; NumSRCInMux=0; mcd.cbStruct = sizeof(MIXERCONTROLDETAILS); mcd.dwControlID = mcarr[k].dwControlID; mcd.cChannels = 1;//mixLine.cChannels; mcd.cMultipleItems = mcarr[k].cMultipleItems; mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN); mcd.paDetails = (LPMIXERCONTROLDETAILS_BOOLEAN)&mixBoolean[0]; result = mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_GETCONTROLDETAILSF_VALUE); if (MMSYSERR_NOERROR ==result) { for(unsigned int iS=0;iS