c语言音量控制源代码

合集下载

乐曲程序c语言代码解析

乐曲程序c语言代码解析

乐曲程序通常指的是使用计算机编程语言来生成和处理音频的程序。

在C语言中,我们可以使用库函数来生成音频,或者直接操作音频文件。

下面是一个简单的C语言程序示例,该程序播放一个音频文件:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <audio.h>#define AUDIO_FILE "path_to_your_audio_file.wav"int main() {// 打开音频文件FILE *file = fopen(AUDIO_FILE, "rb");if (file == NULL) {printf("Could not open the audio file.\n");return 1;}// 获取音频信息WaveHeader header;if (wave_read_header(file, &header) != 0) {printf("Error reading wave header.\n");fclose(file);return 1;}// 播放音频int16_t *buffer = (int16_t *)malloc(header.data_size);if (buffer == NULL) {printf("Memory allocation failed.\n");fclose(file);return 1;}if (fread(buffer, header.data_size, 1, file) != 1) {printf("Error reading audio data.\n");fclose(file);free(buffer);return 1;}fclose(file);// 使用音频库播放音频audio_play(buffer, header.data_size);free(buffer);return 0;}```上述代码使用了`wave_read_header`函数来读取音频文件的头信息,然后使用`fread`函数读取音频数据,并使用`audio_play`函数来播放音频。

C#(源码)电脑音量大小控制器

C#(源码)电脑音量大小控制器

C# 电脑音量大小控制源码备注:直接赋值代码即可用(作为资料保存不错)using System;usingSystem.Windows.Forms;usingControlTheVolume;namespace 电脑音量控制{public partial class Form1 : Form{public Form1(){ InitializeComponent(); }staticintvolumeValue = PC_VolumeControl.GetVolume();intdanqianYL;private void Form1_Load(object sender, EventArgs e){label2.Text = label1.Text = "初始系统音量为:" + PC_VolumeControl.GetVolume().ToString();//显示当前系统音量volumeValue = PC_VolumeControl.GetVolume();}private void button1_Click(object sender, EventArgs e){danqianYL = PC_VolumeControl.GetVolume();label2.Text = "当前系统音量为:" + danqianYL.ToString();PC_VolumeControl.SetVolume(danqianYL + 1000);}private void button2_Click(object sender, EventArgs e){danqianYL = PC_VolumeControl.GetVolume();label2.Text = "当前系统音量为:" + danqianYL.ToString();PC_VolumeControl.SetVolume(danqianYL - 1000);}private void button3_Click(object sender, EventArgs e){PC_VolumeControl.SetVolume(0);label2.Text = "当前系统音量为:" + PC_VolumeControl.GetVolume().ToString();}private void button4_Click(object sender, EventArgs e){try{int value = checked(int.Parse(textBox1.Text));PC_VolumeControl.SetVolume(value);}catch (Exception Ex){ MessageBox.Show(Ex.Message); }}}}//ControlTheVolume.cs类using System;usingSystem.Runtime.InteropServices;usingSystem.Windows.Forms;namespaceControlTheVolume{classPC_VolumeControl{privateconstint MMSYSERR_NOERROR = 0;privateconstint MAXPNAMELEN = 32;privateconstint MIXER_LONG_NAME_CHARS = 64;privateconstint MIXER_SHORT_NAME_CHARS = 16;privateconstint MIXER_GETLINEINFOF_COMPONENTTYPE = 0x3;privateconstint MIXER_GETCONTROLDETAILSF_VALUE = 0x0;privateconstint MIXER_GETLINECONTROLSF_ONEBYTYPE = 0x2;privateconstint MIXER_SETCONTROLDETAILSF_VALUE = 0x0;privateconstint MIXERLINE_COMPONENTTYPE_DST_FIRST = 0x0;privateconstint MIXERLINE_COMPONENTTYPE_SRC_FIRST = 0x1000;privateconstint MIXERCONTROL_CT_CLASS_FADER = 0x50000000;privateconstint MIXERCONTROL_CT_UNITS_UNSIGNED = 0x30000;privateconstint MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED);privateconstint MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1);privateconstint MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4);privateconstint MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);privateconstint MIXERLINE_COMPONENTTYPE_SRC_LINE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2);publicstructMixerCaps{publicintwMid; public intwPid; public intvDriverVersion;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]public string szPname; public intfdwSupport; public intcDestinations;}publicstruct Mixer{publicintcbStruct; public intdwControlID; public intdwControlType; publicintfdwControl; public intcMultipleItems;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_SHORT_NAME_CHARS)]public string szShortName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_LONG_NAME_CHARS)]public string szName; public intlMinimum; public intlMaximum;[MarshalAs(UnmanagedType.U4, SizeConst = 10)]publicint reserved;}publicstructMixerDetails{publicintcbStruct; public intdwControlID; public intcChannels;publicint item; public intcbDetails; public IntPtrpaDetails;}publicstructUnsignedMixerDetails { public intdwValue; }publicstructMixerLine{publicintcbStruct; public intdwDestination; public intdwSource;publicintdwLineID; public intfdwLine; public intdwUser; publicintdwComponentType; public intcChannels; public intcConnections; publicintcControls;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_SHORT_NAME_CHARS)]public string szShortName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_LONG_NAME_CHARS)]public string szName; public intdwType; public intdwDeviceID;publicintwMid; public intwPid; public intvDriverVersion;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]public string szPname;}//定义监听变量publicstructLineControls{publicintcbStruct; public intdwLineID; public intdwControl;publicintcControls; public intcbmxctrl; public IntPtrpamxctrl;}[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerClose(inthmx);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerGetControlDetailsA(inthmxobj, ref MixerDetailspmxcd, intfdwDetails);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerGetDevCapsA(intuMxId, MixerCapspmxcaps, intcbmxcaps);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerGetID(inthmxobj, intpumxID, intfdwId);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerGetLineControlsA(inthmxobj, ref LineControlspmxlc, intfdwControls);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerGetLineInfoA(inthmxobj, ref MixerLinepmxl, intfdwInfo);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerGetNumDevs();[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerMessage(inthmx, intuMsg, int dwParam1, int dwParam2); [DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerOpen(out intphmx, intuMxId, intdwCallback, intdwInstance, intfdwOpen);[DllImport("winmm.dll", CharSet = CharSet.Ansi)]public static extern intmixerSetControlDetails(inthmxobj, ref MixerDetailspmxcd, intfdwDetails);private static boolGetMixer(inti, int type, intctrlType, out Mixer mixerControl, out intcurrVolume){int details;boolbReturn;currVolume = -1;LineControlslineControls = new LineControls();MixerLine line = new MixerLine();MixerDetailsmcDetails = new MixerDetails(); UnsignedMixerDetailsdetailsUnsigned = new UnsignedMixerDetails();mixerControl = new Mixer();//mixerline设置属性的对象line.cbStruct = Marshal.SizeOf(line);line.dwComponentType = type;details = mixerGetLineInfoA(i, ref line, MIXER_GETLINEINFOF_COMPONENTTYPE);if (MMSYSERR_NOERROR == details){intmcSize = 152;int control = Marshal.SizeOf(typeof(Mixer));lineControls.pamxctrl = Marshal.AllocCoTaskMem(mcSize);lineControls.cbStruct = Marshal.SizeOf(lineControls);lineControls.dwLineID = line.dwLineID;lineControls.dwControl = ctrlType;ontrols = 1;lineControls.cbmxctrl = mcSize;mixerControl.cbStruct = mcSize;details = mixerGetLineControlsA(i, ref lineControls, MIXER_GETLINECONTROLSF_ONEBYTYPE);if (MMSYSERR_NOERROR == details){bReturn = true;mixerControl = (Mixer)Marshal.PtrToStructure(lineControls.pamxctrl, typeof(Mixer));}else { bReturn = false; }intmcDetailsSize = Marshal.SizeOf(typeof(MixerDetails));intmcDetailsUnsigned = Marshal.SizeOf(typeof(UnsignedMixerDetails)); mcDetails.cbStruct = mcDetailsSize;mcDetails.dwControlID = mixerControl.dwControlID;mcDetails.paDetails = Marshal.AllocCoTaskMem(mcDetailsUnsigned);hannels = 1;mcDetails.item = 0;mcDetails.cbDetails = mcDetailsUnsigned;details = mixerGetControlDetailsA(i, ref mcDetails, MIXER_GETCONTROLDETAILSF_VALUE);detailsUnsigned = (UnsignedMixerDetails)Marshal.PtrToStructure(mcDetails.paDetails,typeof(UnsignedMixerDetails));currVolume = detailsUnsigned.dwValue;returnbReturn;}bReturn = false;returnbReturn;}/// <summary>///方法将该值设置为一个音量控制/// </summary>private static boolSetMixer(inti, Mixer mixerControl, intvolumeLevel){boolbReturn;int details;MixerDetailsmixerDetails = new MixerDetails();UnsignedMixerDetails volume = new UnsignedMixerDetails();mixerDetails.item = 0;mixerDetails.dwControlID = mixerControl.dwControlID;mixerDetails.cbStruct = Marshal.SizeOf(mixerDetails);mixerDetails.cbDetails = Marshal.SizeOf(volume);hannels = 1;volume.dwValue = volumeLevel;mixerDetails.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(UnsignedMixerDetails))); Marshal.StructureToPtr(volume, mixerDetails.paDetails, false);details = mixerSetControlDetails(i, ref mixerDetails, MIXER_SETCONTROLDETAILSF_VALUE);if (MMSYSERR_NOERROR == details){ bReturn = true; }else{ bReturn = false; }returnbReturn;}/// <summary>/////获取音量/// </summary>public static intGetVolume(){intcurrVolume;intmixerControl;Mixer mixer = new Mixer();mixerOpen(out mixerControl, 0, 0, 0, 0);int type = MIXERCONTROL_CONTROLTYPE_VOLUME;GetMixer(mixerControl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type, out mixer, out currVolume);mixerClose(mixerControl);returncurrVolume;}/// <summary>/// 设置音量大小/// </summary>/// <param name="volumeLevel">音量大小</param>public static void SetVolume(intvolumeLevel){try{intcurrVolume;intmixerControl;Mixer volumeControl = new Mixer();mixerOpen(out mixerControl, 0, 0, 0, 0);intcontrolType = MIXERCONTROL_CONTROLTYPE_VOLUME;GetMixer(mixerControl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, controlType, out volumeControl, out currVolume);if (volumeLevel>volumeControl.lMaximum){ volumeLevel = volumeControl.lMaximum; }else if (volumeLevel<volumeControl.lMinimum){ volumeLevel = volumeControl.lMinimum; }SetMixer(mixerControl, volumeControl, volumeLevel);GetMixer(mixerControl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, controlType, out volumeControl, out currVolume);if (volumeLevel != currVolume){ throw new Exception("不能设置音量"); }mixerClose(mixerControl);}catch (Exception ex){ MessageBox.Show(ex.Message); }} }}。

MFC中控制系统音量类的实现

MFC中控制系统音量类的实现

1.在vc++ 6.0新建VolumeCtrl类2.VolumeCtrl.h文件// VolumeCtrl.h: interface for the CVolumeCtrl class.////////////////////////////////////////////////////////////////////////#include "windows.h"#include <mmsystem.h>#if !defined(AFX_VOLUMECTRL_H__B8EA9E68_F433_4713_88C6_36B12F8D2A01__INC LUDED_)#defineAFX_VOLUMECTRL_H__B8EA9E68_F433_4713_88C6_36B12F8D2A01__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000classCVolumeCtrl{public:CVolumeCtrl(CWnd *pParent);virtual ~CVolumeCtrl();public:BOOL GetVolume(DWORD &dwVol);//获取音量BOOL SetVoleme(DWORD dwVol);//设置音量BOOL amdGetVolumeControl();//得到音量控制设备句柄BOOL amdInitialize();//初始化BOOL amdUnInitialize();private:CWnd * m_hParent; //父窗口指针UINT m_nNumMixers; //混音设备个数HMIXER m_hMixer; //混音设备句柄MIXERCAPS m_mxcaps;CString m_strDsLineName,m_strVolumeControlName;DWORD m_dwMinimum,m_dwMaximum;DWORD m_dwVolumeControlID; //音量控制器ID};#endif// !defined(AFX_VOLUMECTRL_H__B8EA9E68_F433_4713_88C6_36B12F8D2A01__INCLUDE D_)3.VolumeCtrl.cpp文件// VolumeCtrl.cpp: implementation of the CVolumeCtrl class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "MediaPlayer.h"#include "VolumeCtrl.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CVolumeCtrl::CVolumeCtrl(CWnd *pParent){m_hParent=pParent;}CVolumeCtrl::~CVolumeCtrl(){amdUnInitialize();}BOOL CVolumeCtrl::amdInitialize(){m_nNumMixers= ::mixerGetNumDevs();m_hMixer = NULL;::ZeroMemory(&m_mxcaps,sizeof(MIXERCAPS));if(m_nNumMixers != 0){if(::mixerOpen(&m_hMixer,0,(DWORD)m_hParent->GetSafeHwnd(),NULL,MIXER_OBJECTF_ MIXER|CALLBACK_WINDOW)!=MMSYSERR_NOERROR){return FALSE;}if(::mixerGetDevCaps((UINT)m_hMixer,&m_mxcaps,sizeof(MIXERCAPS))!=MMSYSERR_NOERROR){return FALSE;}}else{return FALSE;}return TRUE;}BOOL CVolumeCtrl::amdUnInitialize(){BOOL bResult = TRUE;if(m_hMixer != NULL){if(::mixerClose(m_hMixer)!=MMSYSERR_NOERROR){bResult=FALSE;}m_hMixer = NULL;}returnbResult;}BOOL CVolumeCtrl::SetVoleme(DWORD dwVol){if(m_hMixer == NULL||m_strDsLineName.IsEmpty()||m_strVolumeControlName.IsEmpty()) {return FALSE;}MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = {dwVol};// MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = dwVol;MIXERCONTROLDETAILS mxcd;mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);mxcd.dwControlID = m_dwVolumeControlID;hannels = 1;mxcd.cMultipleItems = 0;mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);mxcd.paDetails = &mxcdVolume;if(::mixerSetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,MIXER_OBJECTF_HMIXER|M IXER_SETCONTROLDETAILSF_VALUE)!=MMSYSERR_NOERROR){return FALSE;}return TRUE;}BOOL CVolumeCtrl::GetVolume(DWORD &dwVol){if(m_hMixer == NULL ||m_strDsLineName.IsEmpty() ||m_strVolumeControlName.IsEmpty()){return FALSE;}MIXERCONTROLDETAILS_UNSIGNED mxcdVolume={dwVol};MIXERCONTROLDETAILS mxcd;mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);mxcd.dwControlID = m_dwVolumeControlID;hannels = 1;mxcd.cMultipleItems = 0;mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);mxcd.paDetails = &mxcdVolume;if(mixerSetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,MIXER_OBJECTF_HMIXER|MI XER_SETCONTROLDETAILSF_VALUE)!=MMSYSERR_NOERROR){return FALSE;}dwVol = mxcdVolume.dwValue;return TRUE;}BOOL CVolumeCtrl::amdGetVolumeControl(){m_strDsLineName.Empty();m_strVolumeControlName.Empty();if(m_hMixer == NULL){return FALSE;}MIXERLINE mxl;mxl.cbStruct = sizeof(MIXERLINE);mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;if(::mixerGetLineInfo((HMIXEROBJ)m_hMixer,&mxl,MIXER_OBJECTF_HMIXER|MIXER_G ETLINEINFOF_COMPONENTTYPE)!=MMSYSERR_NOERROR){return FALSE;}MIXERCONTROL mxc;MIXERLINECONTROLS mxlc;mxlc.cbStruct = sizeof(MIXERLINECONTROLS);mxlc.dwLineID = mxl.dwLineID;mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;ontrols = 1;mxlc.cbmxctrl = sizeof(MIXERCONTROL);mxlc.pamxctrl = &mxc;if(mixerGetLineControls((HMIXEROBJ)m_hMixer,&mxlc,MIXER_OBJECTF_HMIXER|MIXE R_GETLINECONTROLSF_ONEBYTYPE)!=MMSYSERR_NOERROR){return FALSE;}m_strDsLineName = mxl.szName;m_strVolumeControlName = mxc.szName;m_dwMinimum = mxc.Bounds.dwMinimum;m_dwMaximum = mxc.Bounds.dwMaximum;m_dwVolumeControlID = mxc.dwControlID;return TRUE;}。

控制台C语言编写音乐播放器主要功能

控制台C语言编写音乐播放器主要功能

#include "FM_Main.h"#include"CTL.H"#include<stdio.h>#include<windows.h>#include<mmsystem.h>#include"GUI.h"#include"ERR_CheckEnter.h"#pragma comment(lib,"winmm.lib")#include "FM_CheckFile.c"#include"FM_Choose.c"#include"FM_List.c"#include "FM_Path.c"int Order=1; //初始时为第一首歌,随音乐切换而切换--nextsong() int NewOrder=0;int Amount = 0; //歌曲总量int begin; //自定义列表中开始序号int circulatemode=1; //循环模式int pp=0;int begintemp=0; //存储自定义列表边界int ww=-1; // 显示自定义列表当前播放信息int upordown=1; //判断切歌方向int firstup=0;int originvolume=500; //默认音量为500char v[40]="setaudio aa volume to 500"; //初始化音量void Init(){Order=1;NewOrder=0;Amount = 0;circulatemode=1;pp=0;begintemp=0;ww=-1;upordown=1;firstup=0;originvolume=500;}void ShowFileList(){if(begintemp==0)begintemp=begin;Amount = FM_CheckFile();begin = Amount;if(NewOrder==0){Show_GUI_EIGHT();FM_CheckFilePrint(0,Amount);}else{Show_GUI_EIGHT();FM_CheckFilePrint(Amount,begintemp);}};void ShowFileDetails(){int i=0;if(upordown==1){if(NewOrder!=0){Order=Amount+1+ww;ww++;}}if(upordown==2){if(firstup==0){if(NewOrder!=0){Order=Amount+1+ww;ww--;}firstup--;}else{if(NewOrder!=0){Order=Amount+1+ww;ww--;}}}firstup+=4;i=Order-1;printf(" 正在播放的音乐\n");printf("-------------------------------------------------------\n");printf(" 歌曲号歌曲名歌手名\n");printf("-------------------------------------------------------\n");printf(" %3d ",info[i].ID);printf(" %-20s ",info[i].song);printf(" %-10s\n",info[i].singer);printf("-------------------------------------------------------\n");}void Play(){if(NewOrder!=0)Order=Amount+1;char vol[10]="500";char v[40];char ch[200];sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);sprintf(v," setaudio aa volume to %s",vol);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa repeat",NULL,0,NULL);// getchar();}void Stop(){mciSendString ("pause aa",NULL,0,NULL);printf("歌曲播放已暂停,输入3继续播放,输入12退出\n\n");// getchar();}void Resume(){mciSendString ("resume aa",NULL,0,NULL);// getchar();}void FastForward(){int n=1;int m=0;int d=0;int minute;int second;char dd[60][20];char temp[20];do{printf("输入1快进:");scanf("%d",&n);mciSendString ("status aa position", dd[m], 20, 0); char ch[20];sprintf(ch,"%s",dd[m]);d=atoi(dd[m]);d+=5000;minute=(int)(((int)(d/1000))/60);second=(d/1000)-minute*60;itoa(d,dd[m],10);sprintf(temp,"seek aa to %s",dd[m]);mciSendString (temp,NULL,0,NULL);Play();m++;clrscr();ShowFileList();ShowFileDetails();Show_GUI_FOUR();printf("当前时间:%d:%02d \n",minute,second);}while(n==1);}void FastBack(){int n=1;int m=0;int d=0;int minute;int second;char dd[60][20];char temp[20];do{printf("输入1快退");scanf("%d",&n);mciSendString ("status aa position", dd[m], 20, 0); char ch[20];sprintf(ch,"%s",dd[m]);d=atoi(dd[m]);d-=5000;minute=(int)(((int)(d/1000))/60);second=(d/1000)-minute*60;itoa(d,dd[m],10);sprintf(temp,"seek aa to %s",dd[m]);mciSendString (temp,NULL,0,NULL);Play();m++;clrscr();ShowFileList();ShowFileDetails();Show_GUI_FOUR();printf("当前时间:%d:%02d \n",minute,second);}while(n==1);}void StopStop(){char temp[20];char ch[10];itoa(0,ch,10);sprintf(temp,"seek aa to %s",ch);mciSendString (temp,NULL,0,NULL);mciSendString ("pause aa",NULL,0,NULL);printf("点击1重新播放\n\n");}void VolumePlus(){int n=1;// int originvolume=500;char volume[10];char temp[40];while(n==1){printf("输入1增加音量,输入2退出音量增加模式 ");scanf("%d",&n);originvolume+=250;itoa(originvolume,volume,10);sprintf(temp," setaudio aa volume to %s",volume);mciSendString (temp,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);getchar();clrscr();ShowFileList();ShowFileDetails();Show_GUI_FOUR();printf("当前音量:%d\n",originvolume);}originvolume-=250;}void VolumeReduce(){int n=1;// int originvolume=500;char volume[10];char temp[40];while(n==1){printf("输入1降低音量,输入2退出音量降低模式 ");scanf("%d",&n);originvolume-=250;itoa(originvolume,volume,10);sprintf(temp,"setaudio aa volume to %s",volume);mciSendString (temp,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();clrscr();ShowFileList();ShowFileDetails();Show_GUI_FOUR();printf("当前音量:%d\n",originvolume);}originvolume+=250;}void PreSong(){if(NewOrder==0){if(circulatemode==1){if(Order<1){Order=1;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}if(circulatemode==2){if(Order<1){Order=Amount;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}}else{Order=Amount+pp;if(circulatemode==1){if(Order<Amount){Order=Amount;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}if(circulatemode==2){if(Order<Amount){Order=begin;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}pp--;}upordown=2;}void NextSong(){if(NewOrder==0){if(circulatemode==1){if(Order>Amount){Order=Amount;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}if(circulatemode==2){if(Order>Amount)//////////////////////////////////////////////{Order=1;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order-1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}}else{Order=Amount+pp;if(circulatemode==1){if(Order<Amount)/////////////////////有问题{Order=Amount;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order+1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order+1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}if(circulatemode==2){if(Order<Amount)//有问题{Order=begin;char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order+1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[Order+1].add);mciSendString(ch,NULL,0,NULL);mciSendString(v,NULL,0,NULL);mciSendString("play aa ",NULL,0,NULL);// getchar();}}pp++;}upordown=1;}void SelectCirculMode(){int i=0;Show_GUI_SEVEN();scanf("%d",&i);if(i==1)circulatemode=1;if(i==2)circulatemode=2;}void SaveExit(){/*char dd[20];char log[50]={"testlog!!!"};mciSendString ("status aa position", dd, 20, 0);int d;d=atoi(dd);FILE *fp = NULL;fp = fopen("D:\\SaveLog.txt","a");fwrite(log,1,50,fp);*/}void PlayOperation(){int d;re: clrscr();ShowFileList();ShowFileDetails();Show_GUI_FOUR();printf("请选择要进行的操作:");epo:scanf("%d",&d);fflush(stdin);if(ERR_CheckEntero(d)){switch(d){case 1:Play();goto re;case 2:Stop();goto re;case 3:Resume();goto re;case 6:FastForward();goto re;case 8:FastBack();goto re;case 4:StopStop();goto re;case 9:VolumePlus();goto re;case 10:VolumeReduce();goto re;case 5:Order--;PreSong();goto re;case 7:Order++;NextSong();goto re;case 12:ChooseSong();goto re;case 11:SelectCirculMode();goto re;case 13:mciSendString("close aa", NULL, 0, NULL);return;case 14:SaveExit();// getchar();}}else{goto epo;}};void NewOperation(){ee: int i=0;printf("请选择要进行的操作:");scanf("%d",&i);fflush(stdin);switch(i){case 1:FM_CheckFilePrint(0,Amount);begin = FM_Choose(Amount,begin);break;case 2:begin = FM_Path(begin);break;case 3:break;default:printf("输入有误\n");goto ee;}};void ShowNewList(){FM_List(begin,Amount);NewOrder=Amount+1;PlayOperation();}void ChooseSong(){int id = 0;printf("请输入歌曲号:");scanf("%d",&id);if(id<1||id>Amount){printf("选择歌曲不存在!\n");}else{char ch[200];mciSendString("close aa", NULL, 0, NULL);sprintf(ch,"open \"%s\" alias aa",info[id-1].add);mciSendString(ch,NULL,0,NULL);mciSendString("play aa repeat",NULL,0,NULL);}}。

MP3c语言源代码

MP3c语言源代码
static HANDLE hSlider;
static MCI_PLAY_PARMS mciPlay;
static MCI_OPEN_PARMS mciOpen;
static MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;
memset(FileName, 0, sizeof(FileName) );
FileNames.hInstance = NULL ;
FileNames.lpstrFilter = szFilter ;
FileNames.lpstrCustomFilter = NULL ;
FileNames.nMaxCustFilter = 0 ;
}
c[7+i+j]=a[7];
c[8+i+j]=a[8];
memcpy(szFilter, c,100);
FileNames.lStructSize = sizeof (OPENFILENAME) ;
FileNames.hwndOwner = hwnd ;
FileNames.nFilterIndex = 0 ;
FileNames.lpstrFile = szFileName ;
FileNames.nMaxFile = MAX_PATH ;
FileNames.lpstrFileTitle = szTitleName ;
return 0;
}
mciSetAudioPara.dwValue = iPosition*10;
mciSendCommand(mciOpen.wDeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mciSetAudioPara);

c语言课程设计音频信息管理(修改自学生成绩管理系统)

c语言课程设计音频信息管理(修改自学生成绩管理系统)

.一引言在现在的日常生活中,人们对娱乐的要求越来越高。

因为随着科技的突飞猛进,娱乐形式、娱乐设备也越来越多。

而听音乐则是其中一种十分重要而实现起来又十分简单的娱乐形式,所以说,音乐无处不在。

因此,我们对音乐的管理就十分有必要了。

现在的生活节奏越来越快,人们想要更加方便而快捷的管理自己的音乐,节省自己的时间。

而目前我们学习过如何使C语言来进行编程,所以就有了这个简单的设计。

随着各种便携式音乐播放器以及电子计算机的普及,人们所拥有的音乐越来越多,风格,演唱者,各不相同,而人们在不同的心情,不同的天气时对音乐的爱好是不同的。

人们需要更加快捷而方便的管理自己的音乐,让自己的音乐列表井然有序。

可以根据不同的场合,不同的心情快速的找到自己所需要的音乐。

让音乐匹配自己的心情,通过音乐来表达自己的感受是很多人习惯。

音乐是一种娱乐,同时也是一种特别的表达方式。

歌手通过歌曲来表达自己的某种情感,产生与听众的共鸣。

当听众想要表达相同的情感时,直接就可以引用自己听过的歌。

我们让这种娱乐,或者更着重于对自己情感的表达实现起来更加容易。

运用音乐管理程序可以更加方便而快捷的管理自己喜欢的音乐,省去了繁琐的过程,让听音乐更加方便快捷,节省自己的宝贵时间。

音乐管理是每个音乐播放器必须实现的功能之一。

随着各个电子厂商退出自己的便携是播放器,只有高效便捷的的音乐管理方式才能在竞争中脱颖而出。

好的音乐管理程序是对消费者的负责,更是对自己责任的负责。

以前的操作系统等系统软件主要是由汇编语言编写的(包括UNIX操作系统在)。

由于汇编语言指令时机器所不能直接识别、理解和执行的,最好改用高级语言,但一般高级语言难以实现汇编语言的某些功能(汇编语言可以直接对硬件进行操作,例如,对存地址的操作、位操作等)。

人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,集它们的优点于一身。

于是,C语言就在这种情况下应运而生了。

本次课设我选择歌曲管理程序的设计,考察我对结构体,数组的操作,以及C语言算法的掌握。

c语言声音控制的函数

c语言声音控制的函数

c语言声音控制的函数C语言提供了一系列函数来控制声音,在音频处理和媒体应用等领域中发挥着重要作用。

在本文中,我们将介绍几个常用的C语言声音控制函数,以帮助读者了解其基本原理和使用方式。

首先,让我们来研究如何播放声音。

在C语言中,我们可以使用函数`PlaySound()`来实现简单的声音播放功能。

该函数接受一个参数,即指向要播放声音文件的字符串。

通过调用该函数,我们可以播放.wav格式的声音文件。

例如,如果我们想要播放一个名为`sound.wav`的声音文件,我们可以使用以下代码:```PlaySound("sound.wav", NULL, SND_FILENAME);```此处的第二个参数为NULL,表示我们不想使用系统默认的播放方式。

而最后一个参数SND_FILENAME则为我们指定了要播放的声音文件名。

接下来,我们介绍C语言中如何控制声音的音量。

通过使用`waveOutSetVolume()`函数,我们可以调整系统的音量。

这个函数接受两个参数,第一个参数表示音频设备的句柄,我们可以通过`waveOutOpen()`函数获取到该句柄;第二个参数则是一个32位的无符号整数,表示音量大小。

该整数的高16位表示左声道的音量,低16位表示右声道的音量。

比如,如果我们想将左右声道的音量都设置为最大,我们可以使用以下代码:```waveOutSetVolume(NULL, 0xFFFFFFFF);```此处的第一个参数为NULL,表示我们调整的是系统的音量;而第二个参数0xFFFFFFFF表示将左右声道的音量都设置为最大。

除了调整音量,我们还可以使用C语言来生成特定频率的声音。

在这里,我们可以使用`beep()`函数来实现。

`beep()`函数接受两个参数,第一个参数表示频率,第二个参数表示持续时间(以毫秒为单位)。

例如,如果我们想在500Hz的频率下播放一个持续1秒的声音,我们可以使用以下代码:```beep(500, 1000);```通过不同的频率和持续时间组合,我们可以生成不同音高和音长的声音。

用C语言编写后台音乐控制程序

用C语言编写后台音乐控制程序

用C语言编写后台音乐控制程序
黄学军
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】1996(000)001
【摘要】在自己的程序里采用后台音乐控制技术是很诱人的想法。

在C语言中利用ICH中断实现多任务可以解决这个问题,不少书上介绍过这方面的技巧。

笔者就所见到的这方面技巧进行分析,发现有一个不小的缺陷,就是它们只能对音调进行控制,而不能对音长进行控制,这是因为他们大多采用了“for(i=0;i<1000;i++)”,或“delay()”语句进行延时来获得音长的。

这样又带来了一个问题,那就是宝贵的机时都浪费在这些中断服务程序的延时等待上。

【总页数】2页(P17-18)
【作者】黄学军
【作者单位】无
【正文语种】中文
【中图分类】TP311
【相关文献】
1.一个由LabVIEW编写的扫描探针显微镜控制程序 [J], 白江华;John L Freeouf;Andres La Rosa
2.浅析S7-200 PLC顺序控制程序编写的几种思路 [J], 张祁
3.S7-200PLC 顺序控制程序编写的几种思路 [J], 张祁;
4.C语言下拉式菜单程序的常见失误及改进:“后台”演奏音乐 [J], 王水;余光
5.如何用C语言编写步进电机控制程序 [J], 张振环
因版权原因,仅展示原文概要,查看原文内容请购买。

c语言音乐程序编制

c语言音乐程序编制

8位端口输入函数 inportb( )
函数原型:
unsigned char inportb(int portid);
功能: 从地址为 portid 的8位端口输入一个字节(8位), ( ), 所读的值是该函数的返回值,由头文件 dos.h 说明。 用法: #include <dos.h> unsigned char … inportb(端口地址 端口地址) b = inportb(端口地址); b;
1.193MHz输入脉冲
8254的2号 定时器
1
与门
8255并行接口 B口的第 0 位为1时,定时器开始工作,产生音频信号。 8255并行接口 B口的第 1 位为1时,与门打开,音频信号送到扬声器。
控制扬声器发声
8254是可编程的定时器,有0号、1号、2号共3个可独 立编程的16位定时器,还有一个控制字寄存器。 2号定时器工作在方波频率发生器方式,即输出方波信号。 输出方波的频率为:1193180Hz / 计数初值。 向2号定时器写入不同的计数初值,可控制输出方波的频率。 控制字寄存器的I/O端口地址是 0x43 0号定时器的I/O端口地址是 0x40 1号定时器的I/O端口地址是 0x41 2号定时器的I/O端口地址是 0x42 计数初值是16位的,要分两次写入2号定时器,先写低8位, 再写高8位。
main(){ int note=0, fre , dur , control; clock_t goal; while(song[note]!=END){ fre=song[note]; dur=song[note+1]; if(kbhit()) break; if(fre){ outportb(0x43,0xb6); /*若频率值fre非0*/ /*初始化2号定时器 */

c语言 stm32蜂鸣器代码

c语言 stm32蜂鸣器代码

要编写C语言的STM32蜂鸣器代码,首先需要了解蜂鸣器的工作原理和STM32的基本操作。

在编写代码之前,建议按照以下步骤进行准备和规划。

一、了解蜂鸣器的工作原理蜂鸣器是一种能够产生声音的电子元件,它通常由振膜和驱动电路组成。

当有电流通过时,振膜会受到驱动而振动,从而产生声音。

我们在编写蜂鸣器代码时需要考虑如何控制电流输出来操控蜂鸣器的声音。

二、学习STM32的基本操作STM32是由意法半导体公司制造的一系列32位的嵌入式处理器芯片,它具有强大的功能和丰富的外设。

在使用STM32芯片时,需要了解其基本操作,包括寄存器的配置、时钟的设置、外设的控制等。

三、准备开发环境在编写C语言的STM32蜂鸣器代码之前,需要准备好相应的开发环境,包括编译器、调试器、下载器等工具。

常见的开发环境包括Keil、IAR等,选择一款适合自己的开发环境,进行相应的设置和配置。

四、编写蜂鸣器代码在以上准备工作完成之后,就可以着手编写C语言的STM32蜂鸣器代码了。

在编写代码时,需要注意以下几点:1. 选择合适的GPIO引脚首先需要选择一个合适的GPIO引脚来连接蜂鸣器,以便控制蜂鸣器的电流输出。

在选择引脚的需要了解其对应的端口号和引脚号,以便在代码中正确设置。

2. 配置引脚通过设置GPIO的相应寄存器,配置选定的GPIO引脚为输出模式,并初始化为低电平状态,以防止蜂鸣器在开始时就发出声音。

3. 控制蜂鸣器通过设置GPIO引脚的输出状态,来控制蜂鸣器的声音输出。

可以通过循环控制引脚的输出状态,从而产生不同频率和音调的声音。

4. 完善代码在编写完基本的蜂鸣器代码之后,可以考虑添加一些额外的功能,比如控制蜂鸣器的响声时长、声音的音量等,以使代码更加完善和实用。

五、调试和测试代码在编写完代码后,需要进行调试和测试,确保代码能够正常运行。

可以通过连接调试器,使用仿真器进行调试,或者直接下载到STM32芯片中进行测试,检查蜂鸣器是否按照预期工作。

源程序 电子音量控制 程序

源程序   电子音量控制 程序

;;;;;;;;;;;;;;;;;;; 源代码开始 ;;;;;;;;;;;;;;;;;;;;;;;; PGA2310 电子音量控制; PIC12F675,4 MHz MCU; 2006 (c) RUU;; 2006.9.27 Ver0.31 : VR 位置检测和变换的错误修正; 2006.9.5 Ver0.3 : 改变 0.5 dB增减速率,避免偶然杂音; 2006.7.10 Ver0.2 : 控制方法的改变; 2006.6.30 Ver0.1 : 第一个测试版本;;Vdd=5V; 用0 ~Vdd的电平通过GP4实现音量控制,; PGA2310 的增益-95.5dB~+31.5dB 的范围内,; VR 的变化为 128级、每级的是 0.5 db 分辨率。

;; 功能设定:; GP3 为静音功能端子,; 电源开启后大约 1.5 秒开启,2.5 秒后从静音状态转换到VR 的设定值,; 音量平滑上升。

; 如果不需要静音控制,将GP3直接与Vdd连接。

;;; GP0 : ~CS (Output); GP1 : SDO (Output); GP2 : SCLK (Output); GP3 : PWR (Digital Input); GP4 : VOLUME (Analog Input); GP5 : MUTE (Output);;; ※本软件的汇编程序由 CVASM16 推荐;include '12f675.inc'FUSES _INTRC_OSC_NOCLKOUTFUSES _WDT_OFFFUSES _MCLRE_OFFFUSES _PWRTE_ONFUSES _BODEN_ONFUSES _CP_OFFFUSES _CPD_OFFNOT_CS = gpio.0 ; Chip Select (PGA2310)SDO = gpio.1 ; Serial Data (PGA2310)SCLK = gpio.2 ; Serial Clock (PGA2310) PWR = gpio.3 ; Power Monitor inputVR = gpio.4 ; Volume control analog input MUTE = gpio.5 ; Mute Relay driveorg 20hcnt ds 1 ; 等待用途计数器cnt2 ds 1volume8 ds 1 ; Volume 值 8 bitold_pos ds 1 ; 当前的 Vol 位置vo_l ds 1 ; Volume_Left 设定值vo_r ds 1 ; Volume_Right 设定值work ds 1 ; 工作bitcnt ds 1 ; 发送 bit 计数器statflg ds 1 ; 标签VR_CHG = statflg.0 ; volume 变化检测; 内部 EEPROMeeorg 0eedata 'PGA2310 VOL-CNTL -RUU 2006- 'org 0goto startorg 4goto start;; 主程序startclr gpiomov cmcon,#00000111b ; GP0:2 Digital, Comparator offmov adcon0,#00001100b ; ADFM=Left, Vref=VDD, A/D CH=3(GP4) setb rp0call 3FFh ; 时钟脉冲发生器数据设定mov osccal,wmov option,#10001000b ; GPPU无 , PS无mov wpu,#00000000b ;mov trisio,#00011000b ; GP3,4mov iocb,#00000000b ; interrupt on changemov ansel,#00011000b ; ANS3=analog ADCS=Fosc/8clrb rp0mov intcon,#00000000b ; 中断禁止setb NOT_CS ; Not Selectclr statflgclr old_pos:initcall wait_1s ; 1 秒延时jnb PWR,:initclr vo_rclr vo_lcall send_volume ; PGA2310 静音call wait_05s ; 0.5 秒延时setb MUTE ; Relay ONcall wait_1s ; 1 秒延时call get_vr ; 取得Volume 值call conv_vr:dvloopcjae vo_r,volume8,:mainloopinc vo_r ; 从静音到 VR 数值,以 0.5 dB 平滑的上升inc vo_lcall send_volumecall wait_10msgoto :dvloop:mainloopcall wait_1msjnb PWR,:relay_offcall get_vr ; VR 位置取得 -> volume8call chk_vr ; 检测变化量jb VR_CHG,:set_volume ; 2 阶以上变化?goto :mainloop:set_volumemov old_pos,volume8 ; VR 位置保存call conv_vr ; VR 位置 /Vol 值变换 -> volume8 :set_loopcja vo_r,volume8,:v_down ; 上次 Vol 值 (vo_r) 更加小cjb vo_r,volume8,:v_up ; 上次 Vol 值 (vo_r) 更加大goto :mainloop ; 数值变化,如果是没有的话则停止:v_downdec vo_r ; -0.5dbdec vo_lgoto :new_volume:v_upinc vo_r ; +0.5dbinc vo_l:new_volumecall send_volumecall wait_1msgoto :set_loop:relay_offclrb MUTE ; Relay OFFgoto :init;; 向 PGA2310 上发送 Volume 值,设定 (vo_r=右ch, vo_l=左ch)send_volumeclrb SCLK ; SCLK = Lmov work,vo_rmov bitcnt,#8clrb NOT_CS ; ~CS = L:loop_rrl work ; C<- Vol 上位scclrb SDO ; SDO <- Csncsetb SDOnopsetb SCLK ; SCLK = Hnopnopclrb SCLK ; SCLK = Ldjnz bitcnt,:loop_rmov work,vo_lmov bitcnt,#8:loop_lrl workscclrb SDO ; SDO <- Csncsetb SDOnopsetb SCLK ; SCLK = Hnopnopclrb SCLK ; SCLK = Ldjnz bitcnt,:loop_lsetb NOT_CS ; ~CS = Hret;;检测VR 的位置变化chk_vr ; 检测出VR 位置改变cjb volume8,old_pos,:v_dec ; 如果是 vol< old_pos 的话就减小:v_incmov work,volume8sub work,old_pos ; work<- 变化量goto :chk:v_decmov work,old_possub work,volume8:chk ; old_pos 2 位置变化了吗?cjb work,#2,:no_chgsetb VR_CHG ; 变化有 -> VR_CHGret:no_chgclrb VR_CHG ; 变化没有 -> VR_CHGret;; VR 位置变化→数字 VOL 值变换 (128 阶,convtbl )conv_vrclcrr volume8 ; pos-> indexcall convtbl ; index-> volumemov volume8,wret;;; 获取 GP4 VR 位置get_vrmov adcon0,#00001101b ; Left, Vref=VDD, CH=3, A/D=ON call wait_20ussetb go_done ; A/D start:get_waitjb go_done,:get_waitmov volume8,adresh ; A/D 变换结果ret;*** 公用程序 ***wait_20us ; 18(us)mov cnt,#4 ; 2:loopdjnz cnt,:loop ; 3*4+2ret ; 2wait_1ms ; 998(us)mov cnt,#124:loopnopnopnopnopnopdjnz cnt,:loopretwait_5ms ; 5(ms)mov cnt2,#5:loopcall wait_1msdjnz cnt2,:loopretwait_10ms ; 10(ms)mov cnt2,#10:loopcall wait_1msdjnz cnt2,:loopretwait_20ms ; 20(ms)mov cnt2,#20:loopcall wait_1msdjnz cnt2,:loopretwait_250ms ; 0.25(s)mov cnt2,#250:loopcall wait_1msdjnz cnt2,:loopretwait_1s ; 1.00(s)call wait_250mscall wait_250mscall wait_250mscall wait_250msretwait_05s ; 0.50(s)call wait_250mscall wait_250msret;; Volume data conversion tableorg 100hconvtblmov PCLATH,#1mov w,volume8jmp pc+w; 听音曲线补偿; -95.5dB~+3.0dB 变化范围retw 0, 8, 14, 20, 24, 30, 34, 40, 44, 48, 50, 54, 58, 62, 64 retw 68, 72, 74, 78, 80, 84, 86, 90, 92, 94, 96,100,102,104,106 retw 108,110,112,114,117,119,121,123,124,126,128,130,132,133,135 retw 137,138,140,142,143,145,146,148,149,151,152,153,154,156,157 retw 158,160,161,162,163,164,166,167,168,169,170,171,172,173,174 retw 175,176,176,177,178,179,180,180,181,182,183,184,184,185,186 retw 186,187,188,188,188,189,189,190,190,191,192,192,193,193,194 retw 194,194,195,195,196,196,196,197,197,197,198,198,198,198,198 retw 199,199,199,199,199,200,200,200; 音量变化为直线型;-95.5 dB~+31.0dB 变化范围; retw 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 ; retw 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 ; retw 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88 ; retw 90, 92, 94, 96, 98,100,102,104,106,108,110,112,114,116,118 ; retw 120,122,124,126,128,130,132,134,136,138,140,142,144,146,148 ; retw 150,152,154,156,158,160,162,164,166,168,170,172,174,176,178 ; retw 180,182,184,186,188,190,192,194,196,198,200,202,204,206,208 ; retw 210,212,214,216,218,220,222,224,226,228,230,232,234,236,238 ; retw 240,242,244,246,248,250,252,254 ;;;;;;;;;;;;;;;;;;; 源代码结束 ;;;;;;;;;;;;;;;;;;;;;;。

音频重采样与PCM音量调节最后代码

音频重采样与PCM音量调节最后代码

音频重采样与PCM音量调节最后代码#if !defined(__RESAMPLE_H_)#define __RESAMPLE_H_#define UINT unsigned intclass CResample{//protected:public:typedef struct {/* fractional resampling */UINT incr; /* fractional increment */UINT frac;int last_sample;/* integer down sample */int iratio; /* integer divison ratio */int icount, isum;int inv;} ReSampleChannelContext;typedef struct ReSampleContext { ReSampleChannelContext channel_ctx[2];float ratio;/* channel convert */int input_channels, output_channels, filter_channels; } ReSampleContext;ReSampleContext m_context;protected:static void init_mono_resample(ReSampleChannelContext *s, float ratio);static int fractional_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples);static int integer_downsample(ReSampleChannelContext *s, short *output, short *input, int nb_samples);static void stereo_to_mono(short *output, short *input, int n1);static void mono_to_stereo(short *output, short *input, int n1);static void stereo_split(short *output1, short *output2, short *input, int n);static void stereo_mux(short *output, short *input1, short *input2, int n);static void ac3_5p1_mux(short *output, short *input1, short *input2, int n);static int mono_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples);public:CResample();virtual ~CResample();bool audio_resample_init(int output_channels, int input_channels,int output_rate, int input_rate);int audio_resample(short *output, short *input, int nb_samples);static int mono_8bit_to_16bit(short* lp16bits, unsigned char* lp8bits, int len);static int mono_16bit_to_8bit(unsigned char* lp8bits, short* lp16bits, int len);};int init_PCM_resample(CResample **ppResample,int output_channels,int input_channels,int output_rate,int input_rate);int start_PCM_resample(CResample *pResample,int in_len,unsigned char *in_buf,unsigned char *out_buf);int bit_wide_transform(CResample *pResample,int flag,int in_len,unsigned char* in_buf,unsigned char* out_buf);int uninit_PCM_resample(CResample *pResample);int volume_control(short* out_buf,short* in_buf,int in_len, float vol);#endif // !defined(__RESAMPLE_H_)//===================================== ========================================================================== ===================================#include "resample.h"#include <math.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#define FRAC_BITS 16#define FRAC (1 << FRAC_BITS)#define av_free(p) {if(p) free(p);}#define av_malloc(size) malloc(size)/////////////////////////////////////////////////////////////////// ///// Construction/Destruction/////////////////////////////////////////////////////////////////// ///CResample::CResample(){}CResample::~CResample(){}/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// 8bit_to_16bit(注意:输出数据是有符号的还是无符号的)// output: para 1: 16bit的数据// input: para 2: 8bit数据// para 3: 要转换数据的次数,为原数据长度,//注:因为一次转换1个字节变两个字节,所以转换后数据的总长度为8位数据的两倍int CResample::mono_8bit_to_16bit(short* lp16bits, unsigned char* lp8bits, int len){int i=0;for(i=0; i<len; i++) {*lp16bits++ = ((*lp8bits++) -128) << 8;}return i<<1;}/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /voidCResample::init_mono_resample(ReSampleChannelContext *s, float ratio){ratio = (float)(1.0 / ratio);s->iratio = (int)floorf(ratio);if (s->iratio == 0)s->iratio = 1;s->incr = (int)((ratio / s->iratio) * FRAC);s->frac = FRAC;s->last_sample = 0;s->icount = s->iratio;s->isum = 0;s->inv = (FRAC / s->iratio);}/* fractional audio resampling */intCResample::fractional_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples){unsigned int frac, incr;int l0, l1;short *q, *p, *pend;l0 = s->last_sample;incr = s->incr;frac = s->frac;p = input;pend = input + nb_samples;q = output;l1 = *p++;for(;;) {/* interpolate */*q++ = (l0 * (FRAC - frac) + l1 * frac) >> FRAC_BITS;frac = frac + s->incr;while (frac >= FRAC) {frac -= FRAC;if (p >= pend)goto the_end;l0 = l1;l1 = *p++;}}the_end:s->last_sample = l1;s->frac = frac;return q - output;}intCResample::integer_downsample(ReSampleChannelContext *s, short *output, short *input, int nb_samples){short *q, *p, *pend;int c, sum;p = input;pend = input + nb_samples;q = output;c = s->icount;sum = s->isum;for(;;) {sum += *p++;if (--c == 0) {*q++ = (sum * s->inv) >> FRAC_BITS;c = s->iratio;sum = 0;}if (p >= pend)break;}s->isum = sum;s->icount = c;return q - output;}/* n1: number of samples */void CResample::stereo_to_mono(short *output, short *input, int n1){short *p, *q;int n = n1;p = input;q = output;while (n >= 4) {q[0] = (p[0] + p[1]) >> 1;q[1] = (p[2] + p[3]) >> 1;q[2] = (p[4] + p[5]) >> 1;q[3] = (p[6] + p[7]) >> 1;q += 4;p += 8;n -= 4;}while (n > 0) {q[0] = (p[0] + p[1]) >> 1;q++;p += 2;n--;}}/* n1: number of samples */void CResample::mono_to_stereo(short *output, short *input, int n1){short *p, *q;int n = n1;int v;p = input;q = output;while (n >= 4) {v = p[0]; q[0] = v; q[1] = v;v = p[1]; q[2] = v; q[3] = v;v = p[2]; q[4] = v; q[5] = v;v = p[3]; q[6] = v; q[7] = v;q += 8;p += 4;n -= 4;}while (n > 0) {v = p[0]; q[0] = v; q[1] = v;q += 2;p += 1;n--;}}/* XXX: should use more abstract 'N' channels system */void CResample::stereo_split(short *output1, short *output2, short *input, int n){int i;for(i=0;i<n;i++) {*output1++ = *input++;*output2++ = *input++;}}void CResample::stereo_mux(short *output, short *input1, short *input2, int n){int i;for(i=0;i<n;i++) {*output++ = *input1++;*output++ = *input2++;}}void CResample::ac3_5p1_mux(short *output, short *input1, short *input2, int n){int i;short l,r;for(i=0;i<n;i++) {l=*input1++;r=*input2++;*output++ = l; /* left */*output++ = (l/2)+(r/2); /* center */*output++ = r; /* right */*output++ = 0; /* left surround */*output++ = 0; /* right surroud */*output++ = 0; /* low freq */}}int CResample::mono_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples){short *buf1;short *buftmp;buf1= (short*)av_malloc( nb_samples * sizeof(short) );/* first downsample by an integer factor with averaging filter */if (s->iratio > 1) {buftmp = buf1;nb_samples = integer_downsample(s, buftmp, input, nb_samples);} else {buftmp = input;}/* then do a fractional resampling with linear interpolation */ if (s->incr != FRAC) {nb_samples = fractional_resample(s, output, buftmp, nb_samples);} else {memcpy(output, buftmp, nb_samples * sizeof(short));}av_free(buf1);return nb_samples;}bool CResample::audio_resample_init(int output_channels, int input_channels,int output_rate, int input_rate){int i;if ( input_channels > 2){printf("Resampling with input channels greater than 2 unsupported.");return false;}memset(&m_context, 0, sizeof(ReSampleContext));m_context.ratio = (float)output_rate / (float)input_rate;m_context.input_channels = input_channels;m_context.output_channels = output_channels;m_context.filter_channels = m_context.input_channels;if (m_context.output_channels < m_context.filter_channels) m_context.filter_channels = m_context.output_channels;/** ac3 output is the only case where filter_channels could be greater than 2.* input channels can't be greater than 2, so resample the 2 channels and then* expand to 6 channels after the resampling.*/if(m_context.filter_channels>2)m_context.filter_channels = 2;for(i=0;i<m_context.filter_channels;i++) {init_mono_resample(&m_context.channel_ctx[i],m_context.ratio);}return true;}/* resample audio. 'nb_samples' is the number of input samples *//* XXX: optimize it ! *//* XXX: do it with polyphase filters, since the quality here isHORRIBLE. Return the number of samples available in output */// 重采样// output para1:重采样后输出的数据// input para2:输入数据// para3:此帧音频的采样点数// 注:44100的采样点数固定为1024,其他采样率不固定,需要通道此帧长度,通道数,位宽,计算采样点数int CResample::audio_resample(short *output, short *input, int nb_samples){int i, nb_samples1;short *bufin[2];short *bufout[2];short *buftmp2[2], *buftmp3[2];int lenout;if (m_context.input_channels == m_context.output_channels && m_context.ratio == 1.0) {/* nothing to do */memcpy(output, input, nb_samples * m_context.input_channels * sizeof(short));return nb_samples;}/* XXX: move those malloc to resample init code */bufin[0]= (short*) av_malloc( nb_samples * sizeof(short) );bufin[1]= (short*) av_malloc( nb_samples * sizeof(short) );/* make some zoom to avoid round pb */lenout= (int)(nb_samples * m_context.ratio) + 16;bufout[0]= (short*) av_malloc( lenout * sizeof(short) );bufout[1]= (short*) av_malloc( lenout * sizeof(short) );if (m_context.input_channels == 2 &&m_context.output_channels == 1) {buftmp2[0] = bufin[0];buftmp3[0] = output;stereo_to_mono(buftmp2[0], input, nb_samples);} else if (m_context.output_channels >= 2 && m_context.input_channels == 1) {buftmp2[0] = input;buftmp3[0] = bufout[0];} else if (m_context.output_channels >= 2) {buftmp2[0] = bufin[0];buftmp2[1] = bufin[1];buftmp3[0] = bufout[0];buftmp3[1] = bufout[1];stereo_split(buftmp2[0], buftmp2[1], input, nb_samples);} else {buftmp2[0] = input;buftmp3[0] = output;}/* resample each channel */nb_samples1 = 0; /* avoid warning */for(i=0;i<m_context.filter_channels;i++) {nb_samples1 = mono_resample(&m_context.channel_ctx[i], buftmp3[i], buftmp2[i], nb_samples);}if (m_context.output_channels == 2 && m_context.input_channels == 1) {mono_to_stereo(output, buftmp3[0], nb_samples1);} else if (m_context.output_channels == 2) {stereo_mux(output, buftmp3[0], buftmp3[1], nb_samples1);} else if (m_context.output_channels == 6) {ac3_5p1_mux(output, buftmp3[0], buftmp3[1], nb_samples1);}av_free(bufin[0]);av_free(bufin[1]);av_free(bufout[0]);av_free(bufout[1]);return nb_samples1;}// 16bit_to_8bit(注意输出数据是有符号的还是无符号的)// output: para 1: 8bit的数据// input: para 2: 16bit数据// para 3: 要转换数据的次数,为原数据长度的一半,因为一次转换2个字节int CResample::mono_16bit_to_8bit(unsigned char* lp8bits, short* lp16bits, int len){int i=0;for(i=0; i<len; i++) {*lp8bits++ = ((*lp16bits++) >> 8) + 128;}return i>>1;}//===================================== ========================================= ===================// 初始化重采样// input : para1 重采样对象// para2 输出通道数// para3 输入通道数// para4 输出采样率// para5 输入采样率int init_PCM_resample(CResample **ppResample,int output_channels,int input_channels,int output_rate,int input_rate) {CResample *pResample = new CResample();if(NULL == pResample){printf("new CResample faile\n");return -1;}if(!pResample->audio_resample_init(output_channels,input_ channels,output_rate,input_rate)){printf("resample init faile\n");}*ppResample = pResample;return 0;}// 重采样// input : para1 重采样对象// para2 输入长度// para3 输入数据// output: para4 输出数据// return 输出长度int start_PCM_resample(CResample *pResample,int in_len,unsigned char *in_buf,unsigned char *out_buf) {int out_len = 0;int ns_sample_in =0;int ns_sample_out =0;ns_sample_in = in_len/(pResample->m_context.input_channels * sizeof(short));ns_sample_out = pResample->audio_resample((short *)out_buf, (short *)in_buf, ns_sample_in);out_len = ns_sample_out*pResample->m_context.output_channels * sizeof(short);printf("ns_sample_in[%d]----ns_sample_out[%d]--out_len[%d]------\n",ns_sample_in,ns_sample_out,out_len);return out_len;}// 位宽转换// input : para1 重采样对象// para2 flag : [8]--16位转8位 ,[16]--8位转16位// para3 输入数据长度// para4 输入数据// output: para5 输出数据// return 输出数据长度int bit_wide_transform(CResample *pResample,int flag,int in_len,unsigned char* in_buf,unsigned char* out_buf) {// 转换次数,转换单位是源数据一次采样,// 即8位转16位:源数据是一次转换一个字节// 即16位转8位:源数据是一次转换两个字节int ns_sample = 0;if(8 == flag){ns_sample = in_len/2;pResample->mono_16bit_to_8bit(out_buf, (short *)in_buf, ns_sample);return ns_sample*1;}else if(16 == flag){ns_sample = in_len;pResample->mono_8bit_to_16bit((short*)out_buf, in_buf, ns_sample);return ns_sample*2;}}// 去初始化int uninit_PCM_resample(CResample *pResample){if(NULL == pResample){delete pResample;}return 0;}// 音量控制// output: para1 输出数据// input : para2 输入数据// para3 输入长度// para4 音量控制参数,有效控制范围[0,100]int volume_control(short* out_buf,short* in_buf,int in_len, float in_vol){int i,tmp;// in_vol[0,100]float vol = in_vol - 98;if(-98 < vol && vol <0 ){vol = 1/(vol*(-1));}else if(0 <= vol && vol <= 1) {vol = 1;}/*else if(1 < vol && vol <= 2) {vol = vol;}*/else if(vol <= -98){vol = 0;}else if(2 <= vol){vol = 2;}for(i=0; i<in_len/2; i++) {tmp = in_buf[i]*vol;if(tmp > 32767){tmp = 32767;}else if( tmp < -32768){tmp = -32768;}out_buf[i] = tmp;}return 0; }。

ActionScript编程 控制音量和平衡度

ActionScript编程  控制音量和平衡度

ActionScript编程控制音量和平衡度作用:改变声音的音量及左右声道的平衡度。

说明:SoundTransform类包含控制声音音量和平衡度的属性。

因此,使用SoundTransform对象可以改变声音的音量和平衡度。

SoundTransform 类的属性包括6个,其详细介绍如下所示。

●leftToLeft 从0(无)至1(全部)的值,指定了左输入在左扬声器里播放的量。

●leftToRight 从0(无)至1(全部)的值,指定了左输入在右扬声器里播放的量。

●pan 声音从左到右的平移,范围从-1(左侧最大平移)至1(右侧最大平移)。

值0表示没有平移(在左侧和右侧之间平衡居中)。

●rightToLeft 从0(无)至1(全部)的值,指定了右输入在左扬声器里播放的量。

●rightToRight 从0(无)至1(全部)的值,指定了右输入在右扬声器里播放的量。

●volume 音量范围从0(静音)至1(最大音量)。

创建SoundTransform对象的方法如下所示。

var trans:SoundTransform = new SoundTransform(vol, panning);SoundTransform()构造函数可以接受以上两个参数,其详细介绍如下所示。

●vol 音量范围从0(静音)至1(最大音量)。

●panning 声音从左到右的平移,范围从-1(左侧最大平移)至1(右侧最大平移)。

值0表示没有平移(居中)。

创建SoundTransform对象后,将其作为参数传递给play()方法,使该SoundTransform对象应用于为控制播放而创建的新SoundChannel 对象,如下所示。

var trans:SoundTransform = new SoundTransform(vol, panning);soundChannel = sound.play(startTime,loops,trans);SoundChannel对象有个soundTransform属性,它是SoundTransform 类的实例。

VC中实现语音(声音)数据的采集(附源代码)

VC中实现语音(声音)数据的采集(附源代码)

VC中实现语音(声音)数据的采集(附源代码)vc中声音的采集是用api函数来实现的。

一、数字音频基础知识Fourier级数:任何周期的波形可以分解成多个正弦波,这些正弦波的频率都是整数倍。

级数中其他正线波的频率是基础频率的整数倍。

基础频率称为一级谐波。

PCM:pulse code modulation,脉冲编码调制,即对波形按照固定周期频率采样。

为了保证采样后数据质量,采样频率必须是样本声音最高频率的两倍,这就是Nyquist频率。

样本大小:采样后用于存储振幅级的位数,实际就是脉冲编码的阶梯数,位数越大表明精度越高,这一点学过数字逻辑电路的应该清楚。

声音强度:波形振幅的平方。

两个声音强度上的差常以分贝(db)为单位来度量,计算公式如下:20*log(A1/A2)分贝。

A1,A2为两个声音的振幅。

如果采样大小为8位,则采样的动态范围为20*log(256)分贝=48db。

如果样本大小为16位,则采样动态范围为20*log(65536)大约是96分贝,接近了人听觉极限和痛苦极限,是再线音乐的理想范围。

windows同时支持8位和16位的采样大小。

二、相关API函数,结构,消息对于录音设备来说,windows 提供了一组wave***的函数,比较重要的有以下几个:打开录音设备函数MMRESULT waveInOpen(LPHWAVEIN phwi, //输入设备句柄UINT uDeviceID, //输入设备IDLPWAVEFORMATEX pwfx, //录音格式指针DWORD dwCallback, //处理MM_WIM_***消息的回调函数或窗口句柄,线程IDDWORD dwCallbackInstance,DWORD fdwOpen //处理消息方式的符号位);为录音设备准备缓存函数MMRESULT waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT bwh );给输入设备增加一个缓存MMRESULT waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh );开始录音MMRESULT waveInStart( HWAVEIN hwi );清除缓存MMRESULT waveInUnprepareHeader( HWAVEIN hwi,LPWAVEHDR pwh, UINT cbwh);停止录音MMRESULT waveInReset( HWAVEIN hwi );关闭录音设备MMRESULT waveInClose( HWAVEIN hwi );Wave_audio数据格式typedef struct {WORD wFormatTag; //数据格式,一般为WAVE_FORMAT_PCM即脉冲编码WORD nChannels; //声道DWORD nSamplesPerSec; //采样频率DWORD nAvgBytesPerSec; //每秒数据量WORD nBlockAlign;WORD wBitsPerSample;//样本大小WORD cbSize;} WAVEFORMATEX;waveform-audio 缓存格式typedef struct {LPSTR lpData; //内存指针DWORD dwBufferLength;//长度DWORD dwBytesRecorded; //已录音的字节长度DWORD dwUser;DWORD dwFlags;DWORD dwLoops; //循环次数struct wavehdr_tag * lpNext;DWORD reserved;} WAVEHDR;相关消息MM_WIM_OPEN:打开设备时消息,在此期间我们可以进行一些初始化工作MM_WIM_DATA:当缓存已满或者停止录音时的消息,处理这个消息可以对缓存进行重新分配,实现不限长度录音MM_WIM_CLOSE:关闭录音设备时的消息。

播放声音——用C语言

播放声音——用C语言

播放声音——第一次用C语言做游戏声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。

在VC++中可以根据不同的应用要求,用不同的方法实现声音的播放。

一.播放声音文件的简单方法在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。

利用这些函数可以方便地播放声音。

最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOLPlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名,hmod在这里为NULL,fuSound 是播放声音的标志,详细说明请参考VC++中的帮助。

例如播放C:\sound\music.wav可以用sndPlaySound ("c:\\sound\\music.wav",SND_ASYNC);或PlaySound("c:\\sound\\music.wav", NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。

二.将声音文件加入到程序中在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。

同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。

要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。

假设生成的声音文件资源标识符为IDR_WAVE1。

在播放时只需要调用下面的语句:PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,SND_RESOURCE是必须的标志。

c语言发声程序

c语言发声程序

字号:大中小c语言经典教程:发声技术问题:乐谱的 1、2、3、4、5、6、7,加上高低音可以谱出动听的曲子,请编写程序,使计算机能够播放歌曲。

[分析]播放歌曲意味着让计算机发声,声音从 PC 机内的扬声器发出,所以这个问题将与硬件扬声器电路有关。

[解答]解决这一编程问题,让我们首先简单了解一下计算机发声的原理。

在PC 机的系统板上装有定时与计数器 8253 芯片,还有 8255 可编程并行接口芯片,由它们组成的硬件电路可用来产生 PC 机内扬声器的声音,对于 286、386、486、586 等 PC 微机,由于采用了超大规模集成电路,因而看不到这些芯片,它们均集成在外围电路芯片上了。

当我们操作计算机时,常常听到的发声,就是由软件控制这些电路而产生的。

声音的长短和音调的高低,均可由程序进行控制。

在扬声器电路中,定时器的频率决定了扬声器发音的频率,所以可通过设定定时器电路的频率来使扬声器发出不同的声音。

对定时器电路进行频率设定时,首先对其命令寄存器(口地址为 0x43)写命令字,如写入 0xb6,这可用outporb(0x43,0xb6);来实现,则表示选择该定时器的第二个通道,计数频率先送低 8 位(二进制),后送高 8 位。

接着用口地址 0x42 送频率计数值,先送低 8 位,后送高 8 位,即用outportb(0x42,低 8 位频率计数值)和 outportb(0x42,高 8 位频率计数值)来实现。

通过这两步使定时器电路产生一系列方波信号,此信号是否能推动扬声器发音,还要看由 8255 产生的门控信号和送数信号是否为 1,而它们也可编程,口地址为 0x61。

为了不影响 8255 口地址 61H 中的其他高位,应先输入口地址 6lH 的现有值 bits,即用 bits= inportb(0x61)来实现,然后就可用 outportb(0x61,bits|3)来允许发声,而用 outportb(0x61,bits&0xfc)来禁止发声,且不改变 8255 其它位原来的值,关于这方面的详细内容可以参阅 IBM PC/XT 接口技术方面书籍有关内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档