package com.lihan.soundcard;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.media.AudioManager;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity implements AlsaPcmData{
private UsbManager mUsbManager;
public static final String ACTION_DEVICE_PERMISSION = "com.linc.USB_PERMISSION";
private PendingIntent mPermissionIntent;
private StringBuffer tvInfo;
private boolean thisConnect;
private EditText text;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.text = findViewById(R.id.textview);
tvInfo = new StringBuffer();
thisConnect = true;
initAudio();
mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
// 用于USB授权的Intent
mPermissionIntent = PendingIntent.getBroadcast(this,0,new Intent(ACTION_DEVICE_PERMISSION),0);
// 枚举USB设备
HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();
while (iterator.hasNext()) {
UsbDevice device = iterator.next();
// 判断APP对该USB设备是否有权限,若没有权限则申请USB设备权限
if(mUsbManager.hasPermission(device)) {
//do your work
initCommunication(device);
} else {
mUsbManager.requestPermission(device,mPermissionIntent);
}
Log.e("TAG", "\ndevice name: "+device.getDeviceName()+"\ndevice product name:"
+device.getProductName()+"\nvendor id:"+device.getVendorId()+
"\ndevice serial: "+device.getSerialNumber()+
"\ndevice serial: "+device.getProductId());
}
}
@Override
protected void onResume() {
super.onResume();
// 注册USB设备插拔、授权等广播,以监听到之后处理相应的操作。
IntentFilter usbFilter = new IntentFilter();
usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
usbFilter.addAction(ACTION_DEVICE_PERMISSION);
registerReceiver(mUsbReceiver, usbFilter);
// new ExeCommand().run("chmod 777 /dev/snd/pcmC0D0c",-1);
new Thread(){
@Override
public void run() {
super.run();
// AudioRecordDemo demo = new AudioRecordDemo();
// demo.getNoiseLevel();
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
AlsaUtil util = new AlsaUtil(MainActivity.this);
util.init();
util.start();
}
}.start();
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mUsbReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
thisConnect = false;
}
/*==============以下获取特定的USB设备信息=============*/
private UsbEndpoint mUsbEndpointIn;
private UsbEndpoint mUsbEndpointOut;
private UsbInterface mUsbInterfaceInt;
private UsbInterface musbInterfaceOut;
UsbDeviceConnection mUsbDeviceConnection;
/**
*
* 遍历USB设备各个节点,获取节点信息,并且打开USB连接
*/
private void initCommunication(UsbDevice device) {
tvInfo.append("initCommunication in\n");
tvInfo.append("initCommunication in right device\n");
int interfaceCount = device.getInterfaceCount();
tvInfo.append("interfaceCount " + interfaceCount + "\n");
for (int interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) {
UsbInterface usbInterface = device.getInterface(interfaceIndex);
tvInfo.append("=========>>"+ usbInterface.getInterfaceClass() + usbInterface.getInterfaceSubclass() + "<<===================\n");
if ((UsbConstants.USB_CLASS_AUDIO != usbInterface.getInterfaceClass())
&& (UsbConstants.USB_CLASS_HID != usbInterface.getInterfaceClass())) {
tvInfo.append("usbInterface.getInterfaceClass() " + usbInterface.getInterfaceClass() + usbInterface.getInterfaceSubclass() + "\n");
continue;
}
tvInfo.append("========="+ usbInterface.getEndpointCount() + "===================\n");
for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
UsbEndpoint ep = usbInterface.getEndpoint(i);
tvInfo.append("usbInterface.getEndpoint(i) " + ep.getType() + "\n");
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_ISOC) {
if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
mUsbEndpointIn = ep;
mUsbInterfaceInt = usbInterface;
tvInfo.append("mUsbEndpointIn \n");
} else {
mUsbEndpointOut = ep;
musbInterfaceOut = usbInterface;
tvInfo.append("mUsbEndpointOut \n");
}
}
}
}
if ((null == mUsbEndpointIn) || (null == mUsbEndpointOut)) {
tvInfo.append("endpoint is null\n");
mUsbEndpointIn = null;
mUsbEndpointOut = null;
// mUsbInterface = null;
} else {
tvInfo.append("\nendpoint out: " + mUsbEndpointOut + ",endpoint in: " +
mUsbEndpointIn.getAddress()+"\n");
// mUsbInterface = usbInterface;
mUsbDeviceConnection = mUsbManager.openDevice(device);
mUsbDeviceConnection.claimInterface(mUsbInterfaceInt, true);
mUsbDeviceConnection.claimInterface(musbInterfaceOut, true);
tvInfo.append("mUsbDeviceConnection: " + byteToString(mUsbDeviceConnection.getRawDescriptors()) + "\n");
// startReading();
}
}
/**将byte数组转换为可读性高的字符串*/
private String byteToString(byte[] b){
String result = "";
for (int i = 0; i < b.length; i++){
result = String.format("%s %02x", result, b[i]);
}
return result;
}
// USB设备插拔、授权的Receiver。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
tvInfo.append("BroadcastReceiver in\n");
if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
tvInfo.append("ACTION_USB_DEVICE_ATTACHED\n");
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
initCommunication(device);
} e
没有合适的资源?快使用搜索试试~ 我知道了~
TinyAlsa 之举从驱动拿到指定设备的音频输入,同时 AudioTrack 和 AudioRecode 使用默认输入输出
共226个文件
o:49个
d:49个
tinycap:14个
需积分: 50 14 下载量 84 浏览量
2019-04-28
14:38:18
上传
评论 1
收藏 1.52MB RAR 举报
温馨提示
自己写的一个DEMO,以便以后用到,有兴趣的也可以一起研究::::TinyAlsa 之举从驱动拿到指定设备的音频输入,同时 AudioTrack 和 AudioRecode 使用默认输入输出 ,中间还有命令工具
资源推荐
资源详情
资源评论
收起资源包目录
TinyAlsa 之举从驱动拿到指定设备的音频输入,同时 AudioTrack 和 AudioRecode 使用默认输入输出 (226个子文件)
gradlew.bat 2KB
pcm.c 28KB
mixer.c 13KB
tinymix.c 9KB
tinyplay.c 8KB
tinycap.c 8KB
tinypcminfo.c 7KB
alsautil.c 6KB
mixer.o.d 576B
mixer.o.d 574B
pcm.o.d 572B
mixer.o.d 572B
mixer.o.d 571B
mixer.o.d 571B
pcm.o.d 570B
mixer.o.d 569B
pcm.o.d 568B
mixer.o.d 568B
pcm.o.d 567B
pcm.o.d 567B
pcm.o.d 565B
pcm.o.d 564B
tinypcminfo.o.d 403B
tinypcminfo.o.d 401B
tinypcminfo.o.d 399B
tinypcminfo.o.d 398B
tinypcminfo.o.d 398B
tinypcminfo.o.d 396B
tinypcminfo.o.d 395B
tinyplay.o.d 394B
alsautil.o.d 394B
tinyplay.o.d 392B
alsautil.o.d 392B
tinymix.o.d 391B
tinycap.o.d 391B
alsautil.o.d 390B
tinyplay.o.d 390B
tinyplay.o.d 389B
alsautil.o.d 389B
tinycap.o.d 389B
tinyplay.o.d 389B
alsautil.o.d 389B
tinymix.o.d 389B
tinycap.o.d 387B
alsautil.o.d 387B
tinymix.o.d 387B
tinyplay.o.d 387B
tinycap.o.d 386B
tinymix.o.d 386B
tinyplay.o.d 386B
alsautil.o.d 386B
tinycap.o.d 386B
tinymix.o.d 386B
tinycap.o.d 384B
tinymix.o.d 384B
tinymix.o.d 383B
tinycap.o.d 383B
.gitignore 127B
.gitignore 8B
build.gradle 1KB
build.gradle 755B
settings.gradle 16B
gradlew 5KB
asound.h 40KB
asound.h 27KB
asoundlib.h 9KB
alsa_audio.h 8KB
app.iml 13KB
SoundCard.iml 863B
gradle-wrapper.jar 52KB
MainActivity.java 11KB
ExeCommand.java 8KB
AudioRecordDemo.java 3KB
AudioPlayer.java 2KB
UsbAudio.java 1KB
ExampleInstrumentedTest.java 765B
AlsaUtil.java 758B
ExampleUnitTest.java 413B
AlsaPcmData.java 170B
Makefile 741B
README.markdown 40KB
Android.mk 1KB
Android.mk 1KB
Application.mk 27B
pcm.o 126KB
pcm.o 112KB
pcm.o 111KB
tinyplay.o 79KB
pcm.o 65KB
pcm.o 63KB
pcm.o 62KB
pcm.o 60KB
mixer.o 58KB
alsautil.o 54KB
alsautil.o 53KB
alsautil.o 53KB
mixer.o 49KB
tinymix.o 46KB
mixer.o 45KB
tinyplay.o 45KB
共 226 条
- 1
- 2
- 3
资源评论
可以一直吃
- 粉丝: 2
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功