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

📄 6-4.htm

📁 计算机操作系统 西安电子科技大学出版社 操作系统实验
💻 HTM
📖 第 1 页 / 共 5 页
字号:
mso-bidi-font-size:12.0pt;color:#993366'>6</span></i><span lang=EN-US
style='color:#993366'><o:p></o:p></span></b></p>

<p class=MsoNormal align=right style='text-align:right;word-break:break-all'><!--[if gte vml 1]><v:shapetype
 id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
 path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_s1609" type="#_x0000_t75" style='position:absolute;
 left:0;text-align:left;margin-left:0;margin-top:0;width:546.85pt;height:34.15pt;
 z-index:-1;mso-wrap-edited:f;mso-position-horizontal:left;
 mso-position-vertical:top;mso-position-vertical-relative:line' wrapcoords="-26 0 -26 21176 21600 21176 21600 0 -26 0"
 o:allowoverlap="f">
 <v:imagedata src="./6-4.files/image001.jpg" o:title="image_bk"/>
 <w:wrap type="square" anchorx="page"/>
</v:shape><![endif]--><![if !vml]><img width=729 height=46
src="./6-4.files/image002.jpg" align=left hspace=12 v:shapes="_x0000_s1609"><![endif]><b><span
style='font-size:24.0pt;mso-bidi-font-size:12.0pt;font-family:黑体;mso-ascii-font-family:
"Times New Roman";color:navy'>输入</span></b><b><span lang=EN-US
style='font-size:24.0pt;mso-bidi-font-size:12.0pt;mso-fareast-font-family:黑体;
color:navy'>/</span></b><b><span style='font-size:24.0pt;mso-bidi-font-size:
12.0pt;font-family:黑体;mso-ascii-font-family:"Times New Roman";color:navy'>输出管理</span></b><b><span
lang=EN-US style='font-size:16.0pt;mso-bidi-font-size:12.0pt;mso-fareast-font-family:
黑体;color:navy'><span style="mso-spacerun: yes">&nbsp; </span></span></b></p>

<p class=MsoNormal><span lang=EN-US>&nbsp;</span></p>

<p class=MsoNormal><span lang=EN-US>&nbsp;</span></p>

<p class=MsoNormal><span lang=EN-US>&nbsp;</span></p>

<p class=MsoNormal><a name="_Toc16587483"><span lang=EN-US>&nbsp;</span></a></p>

<h2><span style='mso-bookmark:_Toc16587483'><a name="_Toc41901943"><span
lang=EN-US style='mso-bidi-font-family:宋体'>6.4<span style="mso-spacerun:
yes">&nbsp; </span>Linux声音设备编程</span></a></span><span style='mso-bookmark:_Toc16587483'><span
lang=EN-US style='mso-bidi-font-family:宋体'><o:p></o:p></span></span></h2>

<p class=MsoNormal align=center style='text-align:center'><span
style='mso-bookmark:_Toc16587483'><span lang=EN-US>(</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>实验估计时间:</span><span
lang=EN-US>120</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>分钟</span><span lang=EN-US>)</span></span></p>

<p class=MsoNormal><span style='mso-bookmark:_Toc16587483'><span lang=EN-US>&nbsp;</span></span></p>

<p class=MsoNormal style='margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2;
tab-stops:list 21.0pt'><span style='mso-bookmark:_Toc16587483'><![if !supportLists]><span
lang=EN-US style='font-family:Wingdings;mso-bidi-font-weight:bold'>&Oslash;<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]></span><a href="#_背景知识"><span style='mso-bookmark:_Toc16587483'><b><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>背景知识</span></b></span><span style='mso-bookmark:_Toc16587483'></span></a><span
style='mso-bookmark:_Toc16587483'><b><span lang=EN-US><o:p></o:p></span></b></span></p>

<p class=MsoNormal style='margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2;
tab-stops:list 21.0pt'><span style='mso-bookmark:_Toc16587483'><![if !supportLists]><span
lang=EN-US style='font-family:Wingdings;mso-bidi-font-weight:bold'>&Oslash;<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]></span><a href="#_实验目的"><span style='mso-bookmark:_Toc16587483'><b><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>实验目的</span></b></span><span style='mso-bookmark:_Toc16587483'></span></a><span
style='mso-bookmark:_Toc16587483'><b><span lang=EN-US><o:p></o:p></span></b></span></p>

<p class=MsoNormal style='margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2;
tab-stops:list 21.0pt'><span style='mso-bookmark:_Toc16587483'><![if !supportLists]><span
lang=EN-US style='font-family:Wingdings;mso-bidi-font-weight:bold'>&Oslash;<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]></span><a href="#_工具/准备工作"><span style='mso-bookmark:
_Toc16587483'><b><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman"'>工具</span><span lang=EN-US>/</span></b></span><span
style='mso-bookmark:_Toc16587483'><b><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>准备工作</span></b></span><span
style='mso-bookmark:_Toc16587483'></span></a><span style='mso-bookmark:_Toc16587483'><b><span
lang=EN-US><o:p></o:p></span></b></span></p>

<p class=MsoNormal style='margin-left:21.0pt;text-indent:-21.0pt;mso-list:l0 level1 lfo2;
tab-stops:list 21.0pt'><span style='mso-bookmark:_Toc16587483'><![if !supportLists]><span
lang=EN-US style='font-family:Wingdings;mso-bidi-font-weight:bold'>&Oslash;<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]></span><a href="#_实验内容与步骤"><span style='mso-bookmark:
_Toc16587483'><b><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman"'>实验内容与步骤</span></b></span><span
style='mso-bookmark:_Toc16587483'></span></a><span style='mso-bookmark:_Toc16587483'><b><span
lang=EN-US><o:p></o:p></span></b></span></p>

<p class=MsoNormal><span style='mso-bookmark:_Toc16587483'><span lang=EN-US>&nbsp;</span></span></p>

<h3><span style='mso-bookmark:_Toc16587483'><a name="_Toc41901944"></a><a
name="_背景知识"></a><span style='mso-bookmark:_Toc41901944'><span
style='mso-bidi-font-family:宋体'>背景知识</span></span></span><span
style='mso-bookmark:_Toc16587483'><span lang=EN-US style='mso-bidi-font-family:
宋体'><o:p></o:p></span></span></h3>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>在</span><span lang=EN-US>Linux</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>环境下对声音设备进行编程比大多数人想象的要简单得多。常用的声音设备是内部扬声器和声卡,它们对应</span><span
lang=EN-US> /dev</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>目录下的一个或多个设备文件,我们可以像打开普通文件一样打开它们,用</span><span lang=EN-US>ioctl()
</span></span><span style='mso-bookmark:_Toc16587483'><span style='font-family:
宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"'>函数设置一些参数,然后对这些打开的特殊文件进行写操作。</span></span></p>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>由于这些文件并非普通文件,所以不能用</span><span lang=EN-US>ANSI C (</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>标准</span><span
lang=EN-US>C) </span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>的</span><span lang=EN-US>fopen</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>、</span><span
lang=EN-US>fclose</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>等来操作文件,而应该使用系统文件</span><span lang=EN-US>I/O</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>处理函数</span><span
lang=EN-US> (open</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>、</span><span lang=EN-US>read</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>、</span><span
lang=EN-US>write</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>、</span><span lang=EN-US>lseek</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>和</span><span
lang=EN-US>close)</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>来处理这些设备文件。</span><span lang=EN-US>ioctl() </span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>或许是</span><span
lang=EN-US>Linux</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>下最庞杂的函数,它可以控制各种文件的属性,在</span><span lang=EN-US>Linux</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>声音设备编程中,最重要的就是使用此函数正确设置必要的参数。</span></span></p>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>在本实验中,我们通过来学习如何实现</span><span lang=EN-US>Linux</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>下对机器内部扬声器的编程。由于此类编程涉及到系统设备的读写,所以,很多时候需要有</span><span
lang=EN-US>root</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>权限,如果将实验例子编译后不能正确执行,那么,首先请检查是否因为没有操纵某个设备的权限。</span></span></p>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>内部扬声器是控制台的一部分,所以它对应的设备文件为</span><span lang=EN-US>
/dev/console</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>。变量</span><span lang=EN-US>KIOCSOUND</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>在头文件</span><span
lang=EN-US> /usr/include/linux/kd.h</span></span><span style='mso-bookmark:
_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman"'>中声明,使用</span><span lang=EN-US>ioctl() </span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>函数可以来控制扬声器的发声,使用规则为:</span></span></p>

<p class=MsoNormal><span style='mso-bookmark:_Toc16587483'><span lang=EN-US><span
style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ioctl(fd,
KIOCSOUND, (int) tone) ;</span></span></p>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
lang=EN-US>fd</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>为文件设备号,</span><span lang=EN-US>tone</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>是音频值。当</span><span
lang=EN-US>tone</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>为</span><span lang=EN-US>0</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>时,终止发声。但是,这里的音频和我们平常认为的音频是不同的。由于计算机主板定时器的时钟频率为</span><span
lang=EN-US>1.19MHz</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>,所以要进行正确的发声,必须进行如下的转换:</span></span></p>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span></span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>扬声器音频值</span><span
lang=EN-US> = 1190000/</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>期望的音频值</span></span></p>

<p class=MsoNormal style='text-indent:21.0pt'><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>扬声器发声时间的长短通过函数</span><span lang=EN-US>usleep(unsigned long
usec) </span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>来控制,它在头文件</span><span lang=EN-US> /usr/include/unistd.h</span></span><span
style='mso-bookmark:_Toc16587483'><span style='font-family:宋体;mso-ascii-font-family:
"Times New Roman";mso-hansi-font-family:"Times New Roman"'>中定义,让程序睡眠</span><span
lang=EN-US>usec</span></span><span style='mso-bookmark:_Toc16587483'><span
style='font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:
"Times New Roman"'>微秒。</span></span><a href="#_top"><span style='mso-bookmark:
_Toc16587483'><span lang=EN-US style='text-decoration:none;text-underline:none'><!--[if gte vml 1]><v:shape
 id="_x0000_i1025" type="#_x0000_t75" style='width:45pt;height:17.25pt'>
 <v:imagedata src="./6-4.files/image003.gif" o:title="02"/>
</v:shape><![endif]--><![if !vml]><img border=0 width=60 height=23
src="./6-4.files/image003.gif" v:shapes="_x0000_i1025"><![endif]></span></span><span
style='mso-bookmark:_Toc16587483'></span></a><span style='mso-bookmark:_Toc16587483'></span></p>

<h3><span style='mso-bookmark:_Toc16587483'><a name="_Toc41901945"></a><a
name="_实验目的"></a><span style='mso-bookmark:_Toc41901945'><span
style='mso-bidi-font-family:宋体'>实验目的</span></span></span><span
style='mso-bookmark:_Toc16587483'><span lang=EN-US style='mso-bidi-font-family:
宋体'><o:p></o:p></span></span></h3>

⌨️ 快捷键说明

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