cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1938|回复: 0

[转贴]用LabWindows/CVI制作的音频播放器

[复制链接]
发表于 2007-4-24 13:24:31 | 显示全部楼层 |阅读模式
大家都知道,MP3、MID、WAV、WMA等格式的音频文件可以通过调用底层函数来实现播放的!
  在这里,我介绍利用自己编制的音频解码器来播放音乐的例子,其中,已经将解码器封装到了动态库里,只给出了接口函数及调用规则!

动态库头文件为:

//打开音频文件  pathname为文件路径名
int __stdcall opensong (char *pathname);
//播放音频文件  position为播放的起始位置
int __stdcall playsong (char *pathname, int position);
//暂停播放
int __stdcall pausesong (char *pathname);
//停止播放,并关闭设备
int __stdcall stopsong (char *pathname);
//播放状态 kind  0:所播放文件的长度  1:播放状态,为"playing,pause,stoped"等  2:播放的进度,以毫秒计
int __stdcall statussong (char *pathname, int kind, char *status);
//关于对话框
void about(void);


  应用程序界面为:
本帖包含图片:




程序代码为:

#include
#include
#include
#include "exe.h"
#include "mci.h"
static char pathname[MAX_PATHNAME_LEN];
static int panelHandle;
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPSTR lpszCmdLine, int nCmdShow)
{
if (InitCVIRTE (hInstance, 0, 0) == 0)
  return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "exe.uir", PANEL)) < 0)
  return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK OkCallback (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
int status;
char mode[128];
switch (event)
{
  case EVENT_COMMIT:
  status = FileSelectPopup ("", "*.mp3", "*.mp3;*.wav;*.mid;*.wma", "打开音频文件", VAL_OK_BUTTON, 0, 0, 1, 1, pathname);
  opensong(pathname);
  playsong(pathname, 0);
  statussong(pathname, 1, mode);
  SetCtrlVal (panelHandle, PANEL_STRING, mode);
  break;
}
return 0;
}
int CVICALLBACK QuitCallback (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
  case EVENT_COMMIT:
  QuitUserInterface (0);
  break;
}
return 0;
}
int CVICALLBACK stop (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
char status[128];
switch (event)
{
  case EVENT_COMMIT:
  stopsong(pathname);
  statussong(pathname, 1, status);
  SetCtrlVal (panelHandle, PANEL_STRING, status);
  break;
}
return 0;
}
int CVICALLBACK pause (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
char status[128];
switch (event)
{
  case EVENT_COMMIT:
  pausesong(pathname);
  statussong(pathname, 1, status);
  SetCtrlVal (panelHandle, PANEL_STRING, status);
  break;
}
return 0;
}
int CVICALLBACK continu (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
char status[128];
int position = 0;
switch (event)
{
  case EVENT_COMMIT:
  status[0] = '\0';
  statussong(pathname, 2, status);
  Fmt(&position, "%i<%s", status);
  playsong(pathname, position);

  status[0] = '\0';
  statussong(pathname, 1, status);
  SetCtrlVal (panelHandle, PANEL_STRING, status);
  break;
}
return 0;
}
int CVICALLBACK pre (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
char status[128];
int position;
switch (event)
{
  case EVENT_COMMIT:
  statussong(pathname, 1, status);
  SetCtrlVal (panelHandle, PANEL_STRING, status);
  statussong(pathname, 2, status);
  Fmt (&position, "%i<%s", status);
  position += 5000;
  playsong(pathname, position);
  break;
}
return 0;
}
int CVICALLBACK back (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
char status[128];
int position;
switch (event)
{
  case EVENT_COMMIT:
  statussong(pathname, 1, status);
  SetCtrlVal (panelHandle, PANEL_STRING, status);
  statussong(pathname, 2, status);
  Fmt (&position, "%i<%s", status);
  position -= 5000;
  playsong(pathname, position);
  break;
}
return 0;
}
int CVICALLBACK len (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
char status[128];
switch (event)
{
  case EVENT_COMMIT:
  statussong(pathname, 0, status);
  SetCtrlVal (panelHandle, PANEL_STRING, status);
  break;
}
return 0;
}
int CVICALLBACK aboutme (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
  case EVENT_COMMIT:
  about();
  break;
}
return 0;
}
在LabWindows/CVI下制作的动态链接库一般情况下是可以用在其它语言中的,我在这里简单介绍一下用法!

首先,声明外部模块:

Declare Function opensong& Lib "mci.dll" (ByVal x1$)
Declare Function playsong& Lib "mci.dll" (ByVal x1$, ByVal x2&)
Declare Function pausesong& Lib "mci.dll" (ByVal x1$)
Declare Function stopsong& Lib "mci.dll" (ByVal x1$)
Declare Function statussong& Lib "mci.dll" (ByVal x1$, ByVal x2&, ByVal x3$)
Declare Function about& Lib "mci.dll" ()

然后制作界面:
本帖包含图片:



然后写入代码:

Dim x As Integer
Dim status As String * 128
Private Sub Command1_Click()
opensong ("c:\1.mp3")
x = playsong("c:\1.mp3", 0)
x = statussong("c:\1.mp3", 1, status)
Text1.Text = status
End Sub
Private Sub Command2_Click()
x = stopsong("c:\1.mp3")
x = statussong("c:\1.mp3", 1, status)
Text1.Text = status
End Sub
Private Sub Command3_Click()
x = pausesong("c:\1.mp3")
x = statussong("c:\1.mp3", 1, status)
Text1.Text = status
End Sub
Private Sub Command4_Click()
x = statussong("c:\1.mp3", 2, status)
x = playsong("c:\1.mp3", Val(status))
x = statussong("c:\1.mp3", 1, status)
Text1.Text = status
End Sub
Private Sub Command5_Click()
x = statussong("c:\1.mp3", 2, status)
x = playsong("c:\1.mp3", Val(status) + 5000)
x = statussong("c:\1.mp3", 1, status)
Text1.Text = status
End Sub
Private Sub Command6_Click()
x = statussong("c:\1.mp3", 2, status)
x = playsong("c:\1.mp3", Val(status) - 5000)
x = statussong("c:\1.mp3", 1, status)
Text1.Text = status
End Sub

这样就可以了,如果大家有兴趣,可以亲自试一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-7 15:41 , Processed in 0.534570 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表