假设有一USB声卡,支持Asio,如何实现Asio驱动呢?
1 实现Register注册代码。此处省略,可参考Asio官方Sample。
2 实现Class USBAsio: public IASIO, public CUnknown的

Init();
CreateBuffers();
Start();
Stop();
DisposeBuffers();
Exit();

下面参照AsioSample,对每一个函数做讲解,实现自己的驱动。请注意,AsioSample仅实现了屏幕打印,没有实际实现驱动,本代码实现了自己的功能。

ASIOBool CUsbAsio::init (void* sysRef)
{sysRef = sysRef;if (active)return true;strcpy (errorMessage, "ASIO Driver open Failure!");//创建设备并初始化设备m_device = new USBAudioDevice(true);m_device->InitDevice();if (inputOpen ()){if (outputOpen ()){active = true;return AsioTrue;}}//false if(m_device)m_device->stop();delete m_device;m_device = NULL;outputClose();inputClose();return AsioFalse;
}

USBAudioDevice的功能将在后面介绍。inputOpen()初始化inputBuffers,outputOpen()初始化outputbuffers。对inputBuffers, outputBuffers预处理。
outputClose()与inputClose()释放初始化的内存。这四个函数具体如下

bool CUsbAsio::inputOpen()
{if(!m_device)return false;m_inputSampleSize = m_device->GetADCSubslotSize();m_NumInputs = m_device->GetInputChannelNumber();if(inputBuffers)delete inputBuffers;inputBuffers = new char*[m_NumInputs * 2];if(inMap)delete inMap;inMap = new long[m_NumInputs];for(int i = 0; i<m_NumInputs; i++){inputBuffers[i] = NULL;inMap[i] = 0;}if(m_inputSampleSize == 4)m_device->SetADCCallback(CUsbAsio::sFillInputData4, (void*)this);else if(m_inputSampleSize == 3)m_device->SetADCCallback(CUsbAsio::sFillInputData3, (void*)this);m_AsioSyncEvent = CreateEvent(NULL, FALSE, FALSE, NULL);return TRUE;
}bool CUsbAsio::output()
{if(!m_device)return false;m_outputSampleSize = m_device->GetDACSubslotSize();m_Numoutputs = m_device->GetOutputChannelNumber();if(outputBuffers)delete outputBuffers;outputBuffers = new char*[m_Numoutputs *2]; if(outMap)delete outMap;outMap = new long[m_Numoutputs];for(int i=0; i<m_NumOutputs; i++){outputBuffers[i] = NULL;outMap[i] = 0;}if(m_outputSampleSize == 4)m_device->SetDACCallback(CUsbAsio::sFillOutputData4, (void*)this);else if(m_outputSampleSize == 3)m_device->SetDACCallback(CUsbAsio::sFillOutputData3, (void*)this);return true;
}void CUsbAsio::outputClose()
{if(outMap)delete outMap;if(outputBuffers)delete outputBuffers;m_NumOutputs = 0;outMap = NULL;outputBuffers = NULL;
}   void CUsbAsio::inputClose()
{if(inMap)delete inMap;if(inputBuffers)delete inputBuffers;if(m_AsioSyncEvent)CloseHandle(m_AsioSyncEvent);m_NumInput = 0;inMap = NULL;inputBuffers = NULL;m_AsioSyncEvent = NULL;
}   

Asio驱动开发学习笔记(2)相关推荐

  1. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  2. Windows驱动开发学习笔记(六)—— Inline HOOK

    Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...

  3. Windows驱动开发学习笔记(五)—— SSDT HOOK

    Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...

  4. Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)

    Windows驱动开发学习笔记(四)-- 3环与0环通信(常规方式) 设备对象 创建设备对象 设置数据交互方式 创建符号链接 IRP与派遣函数 IRP的类型 其它类型的IRP 派遣函数 派遣函数注册位 ...

  5. Windows驱动开发学习笔记(三)—— 内核空间内核模块

    Windows驱动开发学习笔记(三)-- 内核空间&内核模块 内核空间 实验 第一步:编译如下代码 第二步:将 .sys 文件拷贝到虚拟机中 第三步:部署 .sys 文件并运行 第四步:创建一 ...

  6. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

  7. Windows驱动开发学习笔记(一)—— 环境配置第一个驱动程序

    Windows驱动开发学习笔记(一)-- 环境配置&第一个驱动程序 环境配置 第一个驱动程序 环境配置 安装VS2010:https://pan.baidu.com/s/1uZWWxCtB60 ...

  8. Android深度探索(卷1)HAL与驱动开发学习笔记(8)

    Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动   L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...

  9. Android底层HAL驱动开发学习笔记

    2017.3.27 1.确定任务:加快摄像头的信息获取速率:缩减驱动程序.减小帧的大小,缩减一个像素点的比特流(6/8/10bit) 2.重点了解函数:camerabuffer *buffer=mPr ...

  10. Linux驱动开发学习笔记【12】:Linux自带LED灯驱动

    目录 一.内核自带LED驱动使能 二.内核自带LED驱动分析 三.内核自带LED驱动使用 一.内核自带LED驱动使能 在Linux内核中,已经自带了LED灯的驱动程序,使用的就是platform平台驱 ...

最新文章

  1. linux线程有什么用,在linux下查看一个进程它有多少个线程是用什么命令?
  2. 构建弹性架构组件—ELB和ASG
  3. Linux下MySQL的字符集乱码问题总结
  4. [导入]Update实现多表更新
  5. 宏基笔记本4740 Linux,宏基4740g拆机【教程详解】
  6. bat 存储过程返回值_使用Mybatis过程中遇到的坑
  7. DiskGenius的 “终止位置参数溢出”错误解决方法。
  8. 6.支付平台架构:业务、规划、设计与实现 --- 安全与风控
  9. 覆盖php扩展后服务挂了,PHP 扩展管理
  10. Nginx之4包罗万象 - (虚拟主机)
  11. Windows下安装GitHub客户端
  12. vue使用高德地图API,定位,搜索,拖拽选址
  13. 单容水箱液位pid控制实验报告_过程控制实验-单容水箱液位控制系统
  14. 64qam调制解调MATLAB,16QAM调制解调技术分析与MATLAB仿真
  15. unity 打包减小包体大小
  16. 内窥镜去反光的论文整理(转)
  17. python 泰森多边形边界_geotools中泰森多边形的生成
  18. Android 拦截Home键的常用方法
  19. 在树莓派中解决浏览器自动更新失败弹框遮挡数据的方案
  20. error: device unauthorized.This adb server's $ADB_VENDOR_KEYS is not set

热门文章

  1. 乖离性暗机器人_乖离性百万亚瑟王超弩级暗机器人复刻攻略分享
  2. Ubuntu系统下载安装启动Docker
  3. 机器学习与Web安全结合的基础
  4. [工具:iperf吞吐率测试工具 ]安装以及使用
  5. linux sd卡写文件速度慢,请问硬核写sd卡速度有什么提高的好方法
  6. 汇编语言里调用函数的过程和堆栈平衡问题
  7. LibFetion v0.2.0版发布
  8. 四川大学计算机学院2020推免公示,2020年四川大学计算机(软件)学院夏令营接收推免生条件...
  9. 机器人弹性伸缩算法-专利技术交底书
  10. 32位kali安装minidwep_原水_新浪博客