优秀的音频EQ均衡器音效源码

不多说,直接上图:这是一款客户定制的播放器,播放器功能很强大,比如变速,变调,BPM节拍响应,淡入淡出,音量管家,EQ均衡器音效调节等等个性化功能:

我们着重推荐下EQ均衡器音效调节功能:

此款EQ均衡器音效调节效果,效果不逊于市面上大部分音效效果,如QQ音乐,酷狗,酷我,百度音乐等。支持各种音效个性化调节,由于客户需求,没有预设更多音效,完全可以实现如QQ均衡器界面功能:

我们的均衡器优势在于,频率段数可以定制,比如10段,15段,20段,30段均可,每段的频点可以设置,可以预设更多效果。

贴点调用代码吧

// EQDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "DanceMusic.h"
#include "EQDlg.h"
#include "DanceMusic.h"
#include "DanceMusicDlg.h"
#include "MusicDlg.h"
// CEQDlg 对话框

IMPLEMENT_DYNAMIC(CEQDlg, CDialog)

CEQDlg::CEQDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CEQDlg::IDD, pParent)
{

}

CEQDlg::~CEQDlg()
{
}

void CEQDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SLIDER1, m_eq[0]);
	DDX_Control(pDX, IDC_SLIDER2, m_eq[1]);
	DDX_Control(pDX, IDC_SLIDER3, m_eq[2]);
	DDX_Control(pDX, IDC_SLIDER4, m_eq[3]);
	DDX_Control(pDX, IDC_SLIDER5, m_eq[4]);
	DDX_Control(pDX, IDC_SLIDER6, m_eq[5]);
	DDX_Control(pDX, IDC_SLIDER7, m_eq[6]);
	DDX_Control(pDX, IDC_SLIDER8, m_eq[7]);
	DDX_Control(pDX, IDC_SLIDER9, m_eq[8]);
	DDX_Control(pDX, IDC_SLIDER10, m_eq[9]);
	DDX_Control(pDX, IDC_SLIDER11, m_eq[10]);
	DDX_Control(pDX, IDC_SLIDER12, m_eq[11]);
	DDX_Control(pDX, IDC_SLIDER13, m_eq[12]);
	DDX_Control(pDX, IDC_SLIDER14, m_eq[13]);
	DDX_Control(pDX, IDC_SLIDER15, m_eq[14]);
	DDX_Control(pDX, IDC_SLIDER16, m_eq[15]);
	DDX_Control(pDX, IDC_SLIDER17, m_eq[16]);
	DDX_Control(pDX, IDC_SLIDER18, m_eq[17]);

	DDX_Control(pDX, IDC_ST19, m_eqshow[0]);
	DDX_Control(pDX, IDC_ST20, m_eqshow[1]);
	DDX_Control(pDX, IDC_ST21, m_eqshow[2]);

	DDX_Control(pDX, IDC_ST22, m_eqshow[3]);
	DDX_Control(pDX, IDC_ST23, m_eqshow[4]);
	DDX_Control(pDX, IDC_ST24, m_eqshow[5]);

	DDX_Control(pDX, IDC_ST25, m_eqshow[6]);
	DDX_Control(pDX, IDC_ST26, m_eqshow[7]);
	DDX_Control(pDX, IDC_ST27, m_eqshow[8]);

	DDX_Control(pDX, IDC_ST28, m_eqshow[9]);
	DDX_Control(pDX, IDC_ST29, m_eqshow[10]);
	DDX_Control(pDX, IDC_ST30, m_eqshow[11]);

	DDX_Control(pDX, IDC_ST31, m_eqshow[12]);
	DDX_Control(pDX, IDC_ST32, m_eqshow[13]);
	DDX_Control(pDX, IDC_ST33, m_eqshow[14]);

	DDX_Control(pDX, IDC_ST34, m_eqshow[15]);
	DDX_Control(pDX, IDC_ST35, m_eqshow[16]);
	DDX_Control(pDX, IDC_ST36, m_eqshow[17]);

	DDX_Control(pDX, IDC_CHECK1, m_check);

}


BEGIN_MESSAGE_MAP(CEQDlg, CDialog)
	ON_BN_CLICKED(IDC_BUTTON1, &CEQDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_CHECK1, &CEQDlg::OnBnClickedCheck1)
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_BUTTON2, &CEQDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CEQDlg::OnBnClickedButton3)
END_MESSAGE_MAP()


// CEQDlg 消息处理程序


 
BOOL CEQDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	for(int i=0;i<MACEQ;i++)
	{
		if(i==3||i==4||i==5||i==6||i==7)
			m_eqshow[i].SetFontSize2(10);
	}

	CString szDefault="40,60,80,100,120,150,200,250,300,400,500,600,1000,1800,3100,5300,9200,15800";
	CString szEQ=theApp.m_main->m_inifile.GetValue("EQSet","Frequency","40,60,80,100,120,150,200,250,300,400,500,600,1000,1800,3100,5300,9200,15800");
	CStringArray tempEQs;
	int nTempCount=GetStringsFromSpace(szEQ,tempEQs,",");
	if(nTempCount<MACEQ)
		szEQ=szDefault;

	CString szDefaultDB="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0";
	CString szDB=theApp.m_main->m_inifile.GetValue("EQSet","DBSave","0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0");
	CStringArray tempDBs;
	int nTempCount2=GetStringsFromSpace(szDB,tempDBs,",");
	if(nTempCount2<MACEQ)
		szDB=szDefaultDB;
	GetStringsFromSpace(szDB,tempDBs,",");

	m_pmain->m_player.m_x.EQInitString(szEQ);
	m_check.SetCheck(1);
	m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());
	for(int i=0;i<MACEQ;i++)
	{
		int nDB=atof(tempDBs[i]);
		m_eq[i].SetRange(-12,12);
		m_eq[i].SetPos(1);
		m_eq[i].SetPos(0-nDB);
		m_pmain->m_player.m_x.EQSet(i,nDB);
		this->GetDlgItem(IDC_ST1+i)->SetWindowTextA(ItoA(nDB));
	}
	CStringArray EQs;
	int nCount=GetStringsFromSpace(szEQ,EQs,",");
	for(int i=0;i<nCount;i++)
	{
		m_eqshow[i].SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
		//this->GetDlgItem(IDC_ST19+i)->SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
	}
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CEQDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	for(int i=0;i<MACEQ;i++)
	{
		if(pScrollBar->GetSafeHwnd()==m_eq[i].GetSafeHwnd())
		{
			int nPos=0-m_eq[i].GetPos();
			TRACE("pos:%d\n",nPos);
			m_pmain->m_player.m_x.EQSet(i,nPos);
			this->GetDlgItem(IDC_ST1+i)->SetWindowTextA(ItoA(nPos)/*+"db"*/);
			SaveDBs();
			break;
		}
	}


	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CEQDlg::OnCancel()
{
	ShowWindow(SW_HIDE);
}

void CEQDlg::OnOK()
{
	ShowWindow(SW_HIDE);
}

void CEQDlg::OnBnClickedButton1()
{
	for(int i=0;i<MACEQ;i++)
	{
		m_eq[i].SetPos(0);
		m_pmain->m_player.m_x.EQSet(i,0);
		this->GetDlgItem(IDC_ST1+i)->SetWindowTextA(ItoA(0));
	}

	SaveDBs();

}

void CEQDlg::SaveDBs()
{
	CString szF;
	for(int i=0;i<MACEQ;i++)
	{
		int nPos=0-m_eq[i].GetPos();
		szF+=ItoA(nPos);
		if(i!=MACEQ-1)
			szF+=",";
	}
	theApp.m_main->m_inifile.SetValue("EQSet","DBSave",szF);

}

void CEQDlg::OnBnClickedCheck1()
{
	m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());
}

void CEQDlg::OnBnClickedButton2()//自定义频点
{
	m_pmain->m_player.m_x.EQEnable(0);
	CEQSetDlg dlg;
	if(dlg.DoModal()==IDOK)
	{
		CStringArray EQs;
		int nCount=GetStringsFromSpace(dlg.m_szFs,EQs,",");
		for(int i=0;i<nCount;i++)
		{
			m_eqshow[i].SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
			//this->GetDlgItem(IDC_ST19+i)->SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
		}
		m_pmain->m_player.m_x.EQInitString(dlg.m_szFs);
		m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());	
		OnBnClickedButton1();//修改后复位
	}
	else
		m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());	
}

void CEQDlg::OnBnClickedButton3()
{
	ShowWindow(SW_HIDE);
}

这是调用代码段:

实际上,封装好的EQ设置方法就3个函数:
 

typedef void(*pEQInitString)(CString szEQ);
typedef void(*pEQEnable)(int nEnableEQ);
typedef void(*pEQSet)(int nIndex,double dbDB); 
CString szDefault="40,60,80,100,120,150,200,250,300,400,500,600,1000,1800,3100,5300,9200,15800";
EQInitString(szDefault);    
for(int i=0;i<MACEQ;i++)   
{       
 int nDB=atof(tempDBs[i]);       
 EQSet(i,nDB);    
}

调用挺简单的是吧。

如果大家有这方面需求,可以交流合作的,有需要发DEMO的也可以联系我。这个代码可以出售,由于代码是纯C++编写,可以移植应用到各个平台。欢迎骚扰:QQ35744025,谢谢大家!

猜你喜欢

转载自blog.csdn.net/xjb2006/article/details/104855420