2、在mono中调用共享库
  与.net调用动态库一样,使用DllImport特性来调用。关于mono调用共享库,mono官方有一篇文章介绍得很详细:《Interop with Native Libraries》。
  使用monoDevolop建立一个控制台项目,并将上一步中生成的libTest1.so文件拷贝到/bin/Debug下。
  在Program.cs文件中输入以下代码:
using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Threading;
namespace helloworld
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("the app is started ");
PlayPCM();
Thread thread = new Thread(new ThreadStart(PlayPCM));
thread.Start();
while (true)
{
if (Console.ReadLine() == "quit")
{
thread.Abort();
Console.WriteLine("the app is stopped ");
return;
}
}
}
/// <summary>
/// Plaies the PC.
/// </summary>
static void PlayPCM()
{
using (FileStream fs = File.OpenRead("Ireland.pcm"))
{
byte[] data = new byte[4000];
PcmOpen();
while (true)
{
int readcount = fs.Read(data, 0, data.Length);
if (readcount > 0)
{
Play(data, data.Length);
}
else
{
break;
}
}
PcmClose();
}
}
[DllImport("libTest1.so")]
static extern int PcmOpen();
[DllImport("libTest1.so")]
static extern int Play(byte[] buffer, int length);
[DllImport("libTest1.so")]
static extern int PcmClose();
}
}
  为了便于测试,附件中包含了一个声音文件,可以直接使用这个声音文件。
  3、有关PCM文件的一些简要说明
  附件中的Ireland.pcm,采用的是PCMU编码,采样率为8000Hz,采样深度为1字节,声道数为1。这些对应于snd_pcm_set_params函数,这个函数用于以较简单的方式来设定pcm的播放参数。要正确地播放声音文件,必须使PCM的参数与声音文件的参数一致。