⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tone.cpp

📁 GNU ccAudio2 is a stand-alone portable C++ class framework for manipulating audio data. It has exist
💻 CPP
字号:
// Copyright (C) 2000-2005 Open Source Telecom Corporation.//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.//// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License.//// This exception applies only to the code released under the name GNU// ccAudio.  If you copy code from other releases into a copy of GNU// ccAudio, as the General Public License permits, the exception does// not apply to the code that you add in this way.  To avoid misleading// anyone as to the status of such modified files, you must delete// this exception notice from them.//// If you write modifications of your own for GNU ccAudio, it is your choice// whether to permit this exception to apply to your modifications.// If you do not wish that, delete this exception notice.//#include "private.h"#include "audio2.h"#include <cmath>#ifndef M_PI#define M_PI    3.14159265358979323846#endifusing namespace ost;AudioTone::AudioTone(timeout_t duration, Rate r){	rate = r;	df1 = df2 = 0;	samples = (duration *(long)rate) / 1000;	frame = new Sample[samples];	silencer = true;	reset();}AudioTone::AudioTone(unsigned freq, Level l, timeout_t duration, Rate r){	rate = r;    df1 = (freq * M_PI * 2) / (long)rate;    df2 = (freq * M_PI * 2) / (long)rate;    p1 = 0, p2 = 0;    samples = (duration * (long)rate) / 1000;	m1 = l / 2;	m2 = l / 2;	silencer = false;	frame = new Sample[samples];}AudioTone::AudioTone(unsigned f1, unsigned f2, Level l1, Level l2, timeout_t duration, Rate r){	rate = r;    df1 = (f1 * M_PI * 2) / (long)r;    df2 = (f2 * M_PI * 2) / (long)r;    p1 = 0, p2 = 0;    samples = (duration * (long)r) / 1000;	m1 = l1 / 2;	m2 = l2 / 2;	silencer = false;	frame = new Sample[samples];}unsigned AudioTone::getFrames(Linear buffer, unsigned pages){	unsigned count = 0;	Linear save = frame;	while(count < pages)	{		frame = buffer;		buffer += samples;		if(!getFrame())			break;		++count;	}	if(count && count < pages)		memset(buffer, 0, samples * (pages - count) * 2);	frame = save;	return count;}	bool AudioTone::isComplete(void){	return false;}void AudioTone::silence(void){	silencer = true;}void AudioTone::reset(void){	m1 = m2 = 0;	p1 = p2 = 0;}void AudioTone::single(unsigned freq, Level l){    df1 = (freq * M_PI * 2) / (long)rate;    df2 = (freq * M_PI * 2) / (long)rate;        m1 = l / 2;         m2 = l / 2; 	silencer = false;}void AudioTone::dual(unsigned f1, unsigned f2, Level l1, Level l2){    df1 = (f1 * M_PI * 2) / (long)rate;    df2 = (f2 * M_PI * 2) / (long)rate;        m1 = l1 / 2;        m2 = l2 / 2;	silencer = false;}Audio::Linear AudioTone::getFrame(void){	unsigned count = samples;	Linear data = frame;	if(isSilent() && !p1 && !p2)	{		if(!p1 && !p2)		{			memset(frame, 0, samples * 2);			return frame;		}	}	else if(silencer)	{		while(count--)		{			if(p1 <= 0 && df1 >= p1)			{				p1 = 0;		 		df1 = 0;				m1 = 0;			}			if(p1 >= 0 && -df1 >= p1)			{				p1 = 0;				df1 = 0;				m1 = 0;			}                        if(p2 <= 0 && df2 >= p1)                        {                                p2 = 0;                                df2 = 0;				m2 = 0;                        }                        if(p2 >= 0 && -df2 >= p1)                        {                                p2 = 0;                                df2 = 0;				m2 = 0;                        }			if(!m1 && !m2)			{				*(data++) = 0;				continue;			}			                *(data++) = (Level)(sin(p1) * (double)m1) +        	                (Level)(sin(p2) * (double)m2);			p1 += df1;			p2 += df2;		}	}	else	{		while(count--)		{                	*(data++) = (Level)(sin(p1) * (double)m1) +                        	(Level)(sin(p2) * (double)m2);	                p1 += df1;        	        p2 += df2;		}	}	return frame;}AudioTone::~AudioTone(){	cleanup();}void AudioTone::cleanup(void){	if(frame)	{		delete[] frame;		frame = NULL;	}}bool AudioTone::isSilent(void){	if(!m1 && !m2)		return true;	return false;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -