文档章节

在 Delphi 下使用 DirectSound (1): 枚举播放设备

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 323
阅读 15
收藏 0
点赞 0
评论 0

现在的 Delphi(2010、XE) 已经自带了 DirectX 的相关单元(...\source\rtl\win\).
//枚举函数
function DirectSoundEnumerate(
  lpDSEnumCallback: TDSEnumCallback; //回调函数
  lpContext: Pointer                 //用户指针
): HResult; stdcall; //返回错误代码, 成功则返回 DS_OK(0)

//DirectSoundEnumerate 需要的回调函数的原形:
TDSEnumCallback = function(
  lpGuid: PGUID;            //设备的 GUID
  lpcstrDescription: PChar; //设备描述
  lpcstrModule: PChar;      //模块标识
  lpContext: Pointer        //由 DirectSoundEnumerate 提供的用户指针
): BOOL; stdcall; //返回 True 表示要继续枚举, 不在继续找了就返回 False


这是常见的代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox; //只在窗体上放了一个列表框
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses DirectSound; //!

function EnumCallback(lpGuid: PGUID; lpcstrDescription, lpcstrModule: PChar;
    lpContext: Pointer): BOOL; stdcall;
begin
  Form1.ListBox1.Items.Add(lpcstrDescription);
  Result := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DirectSoundEnumerate(EnumCallback, nil);
end;

end.


在回调函数中直接使用窗体控件不好, 修改如下:
uses DirectSound;

function EnumCallback(lpGuid: PGUID; lpcstrDescription, lpcstrModule: PChar;
    lpContext: Pointer): BOOL; stdcall;
begin
  TStrings(lpContext).Add(lpcstrDescription);
  Result := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DirectSoundEnumerate(EnumCallback, ListBox1.Items);
end;


获取更多信息:
uses DirectSound;

function EnumCallback(lpGuid: PGUID; lpcstrDescription, lpcstrModule: PChar;
    lpContext: Pointer): BOOL; stdcall;
begin
  if lpGuid <> nil then TStrings(lpContext).Add(GUIDToString(lpGuid^));
  TStrings(lpContext).Add(lpcstrDescription);
  if lpcstrModule <> nil then TStrings(lpContext).Add(lpcstrModule);
  TStrings(lpContext).Add(EmptyStr);
  Result := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DirectSoundEnumerate(EnumCallback, ListBox1.Items);
end;

本文转载自:http://www.cnblogs.com/del/archive/2011/01/12/1934003.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
DirectSound入门

文档内容: (费话篇) 关于DirectSound DirectSound是DirectX API的音频(waveaudio)组件之一,它可以提供快速的混音、硬件加速功能,并且可以直接访问相关设备,当然,最主要的是它提供的...

长平狐 ⋅ 2012/08/13 ⋅ 0

C#中使用DirectX编程

我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。 这里是展示最最最最最简单的DirectX播放声音的例子,我尽量省略了无关的代码。最后的代码只有19行,够简单了...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Windows上的音频采集技术(转)

转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音。 之前一直没有研究过音频...

元谷 ⋅ 2013/12/05 ⋅ 0

DirectSound学习(二)--流式缓冲区

使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据。要注意从缓冲区这时...

imxiangzi ⋅ 02/11 ⋅ 0

SDL2源代码分析1:初始化(SDL_Init())

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020 ⋅ 2014/11/01 ⋅ 0

基于ffmpeg、DirectSound开发的mp3播放接口

公司项目中需要开发一个测试声音播放的小功能,由于项目本身就已经使用了ffmpeg进行音视频的编解码,所以此模块继续基于ffmpeg进行开发,由于是在Windows下,所以播放也是基于DirectSound; ...

IcedBeer ⋅ 2016/11/30 ⋅ 0

OPenAL 3D音效开发

介绍: 这几年,随着声卡能力的提升与处理声音API的丰富,3D音效在游戏中扮演着愈演愈烈角色。在游戏中制造一个模拟真实的音响效果与精美的游戏画面同等重要。环境音与音乐可以让玩家感受游戏...

长平狐 ⋅ 2012/08/13 ⋅ 0

在视频处理控件TVideoGrabber中如何设置音频捕捉设备

TVideoGrabber不仅可以捕捉视频,还可以作为多媒体播放器,并支持包括C#、.NET、VB.NET、C++、Delphi、C++Builder和ActiveX平台,本文将剖析TVideoGrabber的音频捕捉设备。 音频源 如果Audio...

菜鸟的春天 ⋅ 2013/08/23 ⋅ 0

一个vc++ direct sound播放wav文件的类

头文件 #if !defined(AFXDIRECTSOUNDHA20FE86F118F11D29AB30060B0CDC13EINCLUDED) #define AFXDIRECTSOUNDHA20FE86F118F11D29AB30060B0CDC13EINCLUDED #if MSCVER >= 1000 #pragma once #end......

junwong ⋅ 2012/03/09 ⋅ 0

delphi资源文件制作及使用详解

delphi资源文件制作及使用详解 摘自:http://www.ej38.com/showinfo/delphi-131567.html 一、引子: 现在的Windows应用程序几乎都使用图标、图片、光标、声音等,我们称它们为资源(Resourc...

vga ⋅ 2015/03/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 45分钟前 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 54分钟前 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 57分钟前 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 今天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 今天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 今天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 今天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 今天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 今天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部