From 8bf40702688673fedb15ddb00f0a2bd819bcc21c Mon Sep 17 00:00:00 2001 From: Brett H Date: Sun, 7 Apr 2024 13:20:30 +0930 Subject: [PATCH] Add microphone infomanager --- Tuniac1/bass_Plugin/BASSInfoManager.cpp | 195 ++++++++++++++++++++++++ Tuniac1/bass_Plugin/BASSInfoManager.h | 36 +++++ 2 files changed, 231 insertions(+) create mode 100644 Tuniac1/bass_Plugin/BASSInfoManager.cpp create mode 100644 Tuniac1/bass_Plugin/BASSInfoManager.h diff --git a/Tuniac1/bass_Plugin/BASSInfoManager.cpp b/Tuniac1/bass_Plugin/BASSInfoManager.cpp new file mode 100644 index 0000000..8f8ac92 --- /dev/null +++ b/Tuniac1/bass_Plugin/BASSInfoManager.cpp @@ -0,0 +1,195 @@ +#include "stdafx.h" +#include "bassinfomanager.h" +// actual class definition here + +CBASSInfoManager::CBASSInfoManager(void) +{ +} + +CBASSInfoManager::~CBASSInfoManager(void) +{ +} + +void CBASSInfoManager::Destroy(void) +{ + delete this; +} + +unsigned long CBASSInfoManager::GetNumExtensions(void) +{ + + return 0; +} + +LPTSTR CBASSInfoManager::SupportedExtension(unsigned long ulExtentionNum) +{ + /* + static LPTSTR exts[] = + { + TEXT(".mp3") + }; + + return exts[ulExtentionNum]; + */ + + return NULL; +} + +bool CBASSInfoManager::CanHandle(LPTSTR szSource) +{ + for (unsigned int x = 0; x < GetNumExtensions(); x++) + { + if (!StrCmpI(SupportedExtension(x), PathFindExtension(szSource))) + { + return(true); + } + } + if (StrCmpN(szSource, TEXT("MICINPUT"), 7) == 0) + { + if (StrCmpN(szSource, TEXT("MICINPUT:GetDevices"), 18) == 0) + { + m_DeviceArray.RemoveAll(); + + BASS_DEVICEINFO info; + for (int device = 0; BASS_RecordGetDeviceInfo(device, &info); device++) + { + if (info.flags & BASS_DEVICE_ENABLED) // device is enabled + { + InfoDevice CurrentDevice = { 0 }; + TCHAR devicename[128] = {0}; + MultiByteToWideChar(CP_UTF8, 0, info.name, (int)strlen(info.name), CurrentDevice.devicename, 128); + + CurrentDevice.channels = 2; + //CurrentDevice.samplerate = 48000; + + switch (info.flags & BASS_DEVICE_TYPE_MASK) + { + case BASS_DEVICE_TYPE_DIGITAL: //An audio endpoint device that connects to an audio adapter through a connector for a digital interface of unknown type. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_DIGITAL"); + } + break; + case BASS_DEVICE_TYPE_DISPLAYPORT: //An audio endpoint device that connects to an audio adapter through a DisplayPort connector. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_DISPLAYPORT"); + } + break; + case BASS_DEVICE_TYPE_HANDSET: //The part of a telephone that is held in the hand and that contains a speaker and a microphone for two - way communication. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_HANDSET"); + } + break; + case BASS_DEVICE_TYPE_HDMI: //An audio endpoint device that connects to an audio adapter through a High - Definition Multimedia Interface(HDMI) connector. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_HDMI"); + } + break; + case BASS_DEVICE_TYPE_HEADPHONES: //A set of headphones. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_HEADPHONES"); + } + break; + case BASS_DEVICE_TYPE_HEADSET: //An earphone or a pair of earphones with an attached mouthpiece for two - way communication. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_HEADSET"); + } + break; + case BASS_DEVICE_TYPE_LINE: //An audio endpoint device that sends a line - level analog signal to a line - input jack on an audio adapter or that receives a line - level analog signal from a line - output jack on the adapter. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_LINE"); + } + break; + case BASS_DEVICE_TYPE_MICROPHONE: //A microphone. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_MICROPHONE"); + } + break; + case BASS_DEVICE_TYPE_NETWORK: //An audio endpoint device that the user accesses remotely through a network. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_NETWORK"); + } + break; + case BASS_DEVICE_TYPE_SPDIF: //An audio endpoint device that connects to an audio adapter through a Sony / Philips Digital Interface(S / PDIF) connector. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_SPDIF"); + } + break; + case BASS_DEVICE_TYPE_SPEAKERS: //A set of speakers. + { + StringCchCopy(CurrentDevice.type, 256, L"BASS_DEVICE_TYPE_SPEAKERS"); + } + break; + } + + BASS_RecordInit(device); + BASS_RECORDINFO RecordInfo = { 0 }; + BASS_RecordGetInfo(&RecordInfo); + CurrentDevice.samplerate = RecordInfo.freq; + int inputs = RecordInfo.inputs; + DWORD format = RecordInfo.formats; + BASS_RecordFree(); + + m_DeviceArray.AddTail(CurrentDevice); + } + + BASS_RecordFree(); + } + if (m_DeviceArray.GetCount()) + return true; + } + else + { + m_ActiveDevice = UNKNOWN_DEVICE; + swscanf_s(szSource, TEXT("MICINPUT:%d"), &m_ActiveDevice); + if (m_ActiveDevice != UNKNOWN_DEVICE && m_ActiveDevice >= 0 && m_ActiveDevice < m_DeviceArray.GetCount()) + { + return true; + } + } + } + + + return false; +} + +bool CBASSInfoManager::GetInfo(LibraryEntry * libEnt) +{ + if (m_ActiveDevice != UNKNOWN_DEVICE && m_ActiveDevice >= 0 && m_ActiveDevice < m_DeviceArray.GetCount()) + { + libEnt->ulBitRate = BITRATE_UNKNOWN; + libEnt->ulChannels = m_DeviceArray[m_ActiveDevice].channels; //2 + libEnt->ulSampleRate = m_DeviceArray[m_ActiveDevice].samplerate; //48000 + libEnt->ulBitsPerSample = BITDEPTH_UNDEFINABLE; + libEnt->ulPlaybackTime = LENGTH_STREAM; + + StringCchCopy(libEnt->szTitle, 128, m_DeviceArray[m_ActiveDevice].devicename); + StringCchCopy(libEnt->szComment, 128, m_DeviceArray[m_ActiveDevice].type); + + return true; + } + return false; +} + +bool CBASSInfoManager::SetInfo(LibraryEntry * libEnt) +{ + return true; +} + +unsigned long CBASSInfoManager::GetNumberOfAlbumArts(void) +{ + return 0; +} + +bool CBASSInfoManager::GetAlbumArt(unsigned long ulImageIndex, + LPVOID* pImageData, + unsigned long* ulImageDataSize, + LPTSTR szMimeType, + unsigned long* ulArtType) +{ + return false; +} + +bool CBASSInfoManager::FreeAlbumArt(LPVOID pImageData) +{ + return false; +} diff --git a/Tuniac1/bass_Plugin/BASSInfoManager.h b/Tuniac1/bass_Plugin/BASSInfoManager.h new file mode 100644 index 0000000..2382590 --- /dev/null +++ b/Tuniac1/bass_Plugin/BASSInfoManager.h @@ -0,0 +1,36 @@ +#pragma once +#include "iinfomanager.h" +#include "bass.h" +#include "array.h" + +class CBASSInfoManager : + public IInfoManager +{ +protected: + + Array m_DeviceArray; + unsigned long m_ActiveDevice; + +public: + CBASSInfoManager(void); + ~CBASSInfoManager(void); + +public: + void Destroy(void); + + unsigned long GetNumExtensions(void); + LPTSTR SupportedExtension(unsigned long ulExtentionNum); + + bool CanHandle(LPTSTR szSource); + bool GetInfo(LibraryEntry * libEnt); + bool SetInfo(LibraryEntry * libEnt); + + unsigned long GetNumberOfAlbumArts(void); + bool GetAlbumArt(unsigned long ulImageIndex, + LPVOID * pImageData, + unsigned long * ulImageDataSize, + LPTSTR szMimeType, + unsigned long * ulArtType); + + bool FreeAlbumArt(LPVOID pImageData); +};