现在介绍一下C++实现CD抓轨转WAV,CD抓轨的方法有好几种,现在介绍其中一种。我们 可以通过API函数CreateFile获得设备句柄,再用API函数DeviceIoControl来实现对设备 的访问获取信息。再此还会用到WAVE文件结构WAVEFORMATEX,再把读到的信息写到文件里 生成WAVE格式的文件。
我们要用到的头文件有: ntddcdrm.h(NTDDK开发包) winioctl.h Mmreg.h
1、搜索光驱
我们可以用GetDriveType来判断设备类型,5为CDROM类型。返回类型可以参看MSDN,里 面有详细介绍。
2、打开设备
用CreateFile获得设备句柄,例子如下:
HANDLE m_hDevice;
CString FileName=”F:”;
m_hDevice =CreateFile("\\\\.\\"+FileName, // 文件名路径
GENERIC_READ, // 读写方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件
3、读取CD参数
得到了设备句柄,我们就可以用DeviceIoControl来获息相关信息.
DeviceIoControl函数原型:
BOOL DeviceIoControl(
HANDLE hDevice, // 设备句柄
DWORD dwIoControlCode, // 控制码
LPVOID lpInBuffer, // 输入数据缓冲区指针
DWORD nInBufferSize, // 输入数据缓冲区长度
LPVOID lpOutBuffer, // 输出数据缓冲区指针
DWORD nOutBufferSize, // 输出数据缓冲区长度
LPDWORD lpBytesReturned, // 输出数据实际长度单元长度
LPOVERLAPPED lpOverlapped // 重叠操作结构指针
);
4、获取曲目
使用IOCTL_CDROM_READ_TOC控制码输出CDROM_TOC结构
BOOL bResult;
DWORD dwOutBytes;
CDROM_TOC CdromTOC; //曲目信息结构,详细请看MSDN
bResult=DeviceIoControl(m_hDevice,
IOCTL_CDROM_READ_TOC,NULL,0,
&CdromTOC,
sizeof(CdromTOC),
&dwOutBytes,
(LPOVERLAPPED)NULL);
5、获取曲目始点
DWORD CCdToWavDlg::GetStartSector(int track)
{
return (CdromTOC.TrackData[track-1].Address[1]*60*75 +
CdromTOC.TrackData[track-1].Address[2]*75 +
CdromTOC.TrackData[track-1].Address[3])-150;
}