操作 Wave 文件(10): 输入输出设备与格式支持

原文链接:https://my.oschina.net/hermer/blog/320782

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses MMSystem;

//设备列表; 指定设备时经常使用 WAVE_MAPPER 参数, 这样会自动选用合适的设备.
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  waveOutCaps: TWaveOutCaps;
  waveInCaps: TWaveInCaps;
begin
  ListBox1.Items.Add('音频输出设备列表:');
  for i := 0 to waveOutGetNumDevs do
  begin
    ZeroMemory(@waveOutCaps, SizeOf(TWaveOutCaps));
    waveOutGetDevCaps(i, @waveOutCaps, SizeOf(TWaveOutCaps));
    ListBox1.Items.Add(waveOutCaps.szPname);
  end;

  ListBox2.Items.Add('音频输入设备列表:');
  for i := 0 to waveInGetNumDevs do
  begin
    ZeroMemory(@waveInCaps, SizeOf(TWaveInCaps));
    waveOutGetDevCaps(i, @waveInCaps, SizeOf(TWaveInCaps));
    ListBox2.Items.Add(waveInCaps.szPname);
  end;
end;

//判断是否支持指定的 Wave 格式
procedure TForm1.Button2Click(Sender: TObject);
var
  fmt: TPCMWaveFormat;
begin
  fmt.wf.wFormatTag := WAVE_FORMAT_PCM;
  fmt.wf.nChannels := 2;
  fmt.wf.nSamplesPerSec := 22050;
  fmt.wf.nAvgBytesPerSec := 88200;
  fmt.wf.nBlockAlign := 4;
  fmt.wBitsPerSample := 16;

  if waveOutOpen(nil, 0, PWaveFormatEx(@fmt), 0, 0, WAVE_FORMAT_QUERY) = 0 then
    ShowMessage('第一个输出设备支持此格式');

  if waveInOpen(nil, 0, PWaveFormatEx(@fmt), 0, 0, WAVE_FORMAT_QUERY) = 0 then
    ShowMessage('第一个输入设备支持此格式');
end;

end.

 
 
 
 
 

 

 

  

有把格式支持的判断写成函数的, 如:

function IsFormatSupported(fmt: Pointer; DeviceId: DWORD): Boolean;
begin
  Result := (waveOutOpen(nil, DeviceId, PWaveFormatEx(fmt), 0, 0, WAVE_FORMAT_QUERY) = 0);
end;

 
 
 
 
 

 

 

  

转载于:https://my.oschina.net/hermer/blog/320782

展开阅读全文
博主设置当前文章不允许评论。

wave 文件中的数据转换

10-15

最近很想去做音频开发,于是私自研究了下播放器,rnrn目前用win7的 core audio 写了个小demo,界面弄了一下下,然后写到了播放部分,core audio这块的api熟悉了之后,目前开始写第一个支持的格式,从wave下手了,因为这个是最直白的格式了吧....rnrn然后我创建了共享模式的IAudioClient,然后手头上有个wave文件,使用千千静听转换的;rnrnpwfDeviceFormat 是WAVEFORMATEX指针rnrn[code=C/C++]rn //如果数据格式不是整数或浮点则创建失败rn switch (m_pwfDeviceFormat->wFormatTag)rn rn case WAVE_FORMAT_IEEE_FLOAT:rn m_eDeviceDataFormat = Data_Float;rn break;rnrn case WAVE_FORMAT_PCM:rn m_eDeviceDataFormat = Data_Int;rn break;rnrn case WAVE_FORMAT_EXTENSIBLE:rn rn WAVEFORMATEXTENSIBLE *pExt = reinterpret_cast(m_pwfDeviceFormat);rn if ( KSDATAFORMAT_SUBTYPE_IEEE_FLOAT == pExt->SubFormat )rn m_eDeviceDataFormat = Data_Float;rn else if ( KSDATAFORMAT_SUBTYPE_PCM == pExt->SubFormat )rn m_eDeviceDataFormat = Data_Int;rn rn break;rnrn default:rn m_eDeviceDataFormat = Data_Unknown;rn break;rn rn[/code]rn1 得到的匹配的数据格式是浮点格式,然后wave的数据内容好像是PCM,也就是整数?rnrn然后现在该怎么将整数格式转换到浮点呢??rnrn2 文件的格式是 两个通道, 每个nBlockAlign是16bit ,而设备支持的格式是nBlockAlign = 32bit ,并且每秒采样数(nSamplesPerSec)大于文件中的采样率,这个大概是要进行线性插值,但是如何从16bit 转换到 32bit? rnrn已经研究好久了 ,实在搞不定了特此求助各位高手!! 多谢了! 论坛

没有更多推荐了,返回首页