Skip to content

Commit 5b5e991

Browse files
committed
增加USB声卡相关操作
1 parent 70bb265 commit 5b5e991

19 files changed

+856
-157
lines changed

apps/player/Android.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ LOCAL_SRC_FILES += AudioId3.cpp
8080
LOCAL_SRC_FILES += base64.cpp
8181
LOCAL_SRC_FILES += Uvcontert.cpp
8282
LOCAL_SRC_FILES += USBHiFi.cpp
83+
LOCAL_SRC_FILES += USBAudioConnectView.cpp
84+
LOCAL_SRC_FILES += KernelMsgGet.cpp
8385

8486
LOCAL_CPPFLAGS:=\
8587
-I $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics\

apps/player/KernelMsgGet.cpp

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
#include "player.h"
2+
#include <sys/socket.h>
3+
#include <linux/netlink.h>
4+
#include <cutils/sockets.h>
5+
#include <poll.h>
6+
#include <sys/un.h>
7+
8+
#define USB_MSG_CHANGE "change@/devices/virtual/android_usb/android0"
9+
#define USB_MSG_PATH "/devices/virtual/android_usb/android0/state"
10+
11+
namespace mango
12+
{
13+
#define USB_FUNCTION_PATH "/sys/class/android_usb/android0/functions"
14+
#define USB_STATE_PATH "/sys/class/android_usb/android0/state"
15+
#define USB_FUNCTION_HIFI "hifi\n"
16+
#define USB_CONNECT_STAT "DISCONNECTED\n"
17+
18+
int isHifiUSBMode(){
19+
int fd = -1;
20+
int result = 0;
21+
char buf[20] = {0};
22+
23+
fd = open(USB_FUNCTION_PATH, O_RDONLY);
24+
if(fd<=0){
25+
return 0;
26+
}
27+
read(fd,buf,20);
28+
close(fd);
29+
30+
if(strcmp(buf,USB_FUNCTION_HIFI)==0){
31+
// if(1){
32+
fd = open(USB_STATE_PATH, O_RDONLY);
33+
if(fd<=0){
34+
log_i("open %s fail",USB_STATE_PATH);
35+
return 0;
36+
}
37+
read(fd,buf,20);
38+
close(fd);
39+
40+
if(strcmp(buf,USB_CONNECT_STAT)!=0){
41+
result = 1;
42+
}
43+
44+
log_i("isHifiMode buf=%s result=%d",buf,result);
45+
}else{
46+
result = 0;
47+
}
48+
49+
return result;
50+
}
51+
52+
KernelMsgGet::KernelMsgGet(void){
53+
mPlayerEventInterface=NULL;
54+
SocketInit();
55+
}
56+
57+
KernelMsgGet::~KernelMsgGet(void){
58+
}
59+
60+
unsigned int KernelMsgGet::DetectLoop(void* p){
61+
KernelMsgGet *ikernelMsgGet = (KernelMsgGet *)p;
62+
ikernelMsgGet->DetectRun();
63+
}
64+
#if 1
65+
int KernelMsgGet::SocketInit(){
66+
struct sockaddr_nl addr;
67+
int sz = 64*1024;
68+
int s;
69+
70+
memset(&addr, 0, sizeof(addr));
71+
addr.nl_family = PF_NETLINK;
72+
addr.nl_pid = getpid();
73+
addr.nl_groups = 0xffffffff;
74+
75+
s = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT);
76+
if(s < 0)
77+
return 0;
78+
log_i("NETLINK_KOBJECT_UEVENT = %d",NETLINK_KOBJECT_UEVENT);
79+
80+
setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));
81+
82+
if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
83+
close(s);
84+
return 0;
85+
}
86+
87+
mFd = s;
88+
89+
mDetectThread.create(DetectLoop,this);
90+
91+
return (mFd >= 0);
92+
}
93+
#else
94+
int KernelMsgGet::SocketInit(){
95+
socklen_t clt_addr_len;
96+
int listen_fd;
97+
int com_fd;
98+
int ret;
99+
int i;
100+
static char recv_buf[1024];
101+
int len;
102+
103+
struct sockaddr_un srv_addr;
104+
listen_fd=socket(AF_UNIX,SOCK_STREAM,0);
105+
if(listen_fd<0)
106+
{
107+
perror("cannot create communication socket");
108+
return -1;
109+
}
110+
//set server addr_param
111+
srv_addr.sun_family=AF_UNIX;
112+
strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
113+
unlink(UNIX_DOMAIN);
114+
//bind sockfd & addr
115+
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
116+
if(ret==-1)
117+
{
118+
perror("cannot bind server socket");
119+
close(listen_fd);
120+
unlink(UNIX_DOMAIN);
121+
return -2;
122+
}
123+
//listen sockfd
124+
ret=listen(listen_fd,1);
125+
if(ret==-1)
126+
{
127+
perror("cannot listen the client connect request");
128+
close(listen_fd);
129+
unlink(UNIX_DOMAIN);
130+
return -3;
131+
}
132+
//have connect request use accept
133+
/* len=sizeof(clt_addr);
134+
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
135+
if(com_fd<0)
136+
{
137+
perror("cannot accept client connect request");
138+
close(listen_fd);
139+
unlink(UNIX_DOMAIN);
140+
return -4;
141+
}
142+
//read and printf sent client info
143+
log_i("/n=====info=====/n");
144+
for(i=0;i<4;i++)
145+
{
146+
memset(recv_buf,0,1024);
147+
int num=read(com_fd,recv_buf,sizeof(recv_buf));
148+
log_i("Message from client (%d)) :%s/n",num,recv_buf);
149+
}*/
150+
// close(com_fd);
151+
// close(listen_fd);
152+
// unlink(UNIX_DOMAIN);
153+
// return 1;
154+
155+
mFd = listen_fd;
156+
157+
mDetectThread.create(DetectLoop,this);
158+
159+
return (mFd >= 0);
160+
}
161+
#endif
162+
163+
#if 1
164+
void KernelMsgGet::DetectRun(void){
165+
char buffer[1024];
166+
int len;
167+
while (1){
168+
while (1) {
169+
struct pollfd fds;
170+
int nr;
171+
172+
fds.fd = mFd;
173+
fds.events = POLLIN;
174+
fds.revents = 0;
175+
nr = poll(&fds, 1, -1);
176+
177+
if(nr > 0 && fds.revents == POLLIN) {
178+
int count = recv(mFd, buffer, sizeof(buffer), 0);
179+
if (count > 0) {
180+
len = count;
181+
break;
182+
}
183+
}
184+
}
185+
buffer[len] = '\0';
186+
log_i("KernelMsgGet::DetectRun %s",buffer);
187+
if(strstr(buffer,USB_MSG_CHANGE)){
188+
//log_i("isHifiMode()=%d",isHifiUSBMode())
189+
if(isHifiUSBMode()){
190+
//system("start usbd");
191+
if(mPlayerEventInterface != NULL)
192+
mPlayerEventInterface->onKeyDispatch(USBHIFI_AUDIO_MSG,VM_MEDIA,0);
193+
log_i("start usbd");
194+
}else{
195+
if(mPlayerEventInterface != NULL)
196+
mPlayerEventInterface->onKeyDispatch(USBHIFI_AUDIO_STOP,VM_MEDIA,0);
197+
}
198+
}
199+
}
200+
}
201+
#else
202+
void KernelMsgGet::DetectRun(void){
203+
char recv[1024];
204+
int len,com_fd,ret;
205+
struct sockaddr_un clt_addr;
206+
while (1){
207+
len = sizeof(clt_addr);
208+
com_fd = accept(mFd,(struct sockaddr*)&clt_addr,&len);
209+
if(com_fd<0){
210+
close(mFd);
211+
unlink(UNIX_DOMAIN);
212+
break;
213+
}
214+
//read and printf sent client info
215+
while(1){
216+
memset( recv, 0, sizeof(recv));
217+
len = read(com_fd, recv, sizeof(recv));
218+
if(len == 0){
219+
close( com_fd );
220+
log_i("close( com_fd )");
221+
break;
222+
}else if(len < 0){
223+
unlink(UNIX_DOMAIN);
224+
close(com_fd);
225+
close(mFd);
226+
break;
227+
}else{
228+
int result = 0;
229+
log_i("Message from client:%s",recv);
230+
if(strcmp(recv,UNIX_MSG_SDCARD_MOUNT)==0){
231+
log_i("sdcard insert");
232+
result = SDCARD_MOUNT;
233+
}else if(strcmp(recv,UNIX_MSG_SDCARD_UNMOUNT)==0){
234+
log_i("sdcard eject");
235+
result = SDCARD_UNMOUNT;
236+
}else if(strcmp(recv,UNIX_MSG_FLASH_UNMOUNT)==0){
237+
log_i("usb open");
238+
result = FLASH_UNMOUNT;
239+
}else if(strcmp(recv,UNIX_MSG_FLASH_MOUNT)==0){
240+
log_i("usb close");
241+
result = FLASH_MOUNT;
242+
}else if(strcmp(recv,UNIX_MSG_SDCARD_START_UMOUNT)==0){
243+
log_i("sdcard start unmounting");
244+
result = SDCARD_START_UNMOUNT;
245+
}else if(strcmp(recv,UNIX_MSG_SDCARD_SHARE)==0){
246+
log_i("sdcard start share");
247+
result = SDCARD_SHARE_UNMOUNT;
248+
}else if(strstr(recv,"usbAudio msg") || strstr(recv,"usbAudio start")){
249+
result = USBHIFI_AUDIO_MSG;
250+
mAudioBuf = recv;
251+
log_i("usbAudio start");
252+
}else if(strstr(recv,"usbAudio stop")){
253+
result = USBHIFI_AUDIO_STOP;
254+
log_i("usbAudio stop");
255+
}else
256+
log_i("usb unknow");
257+
if(result > 0 && result != USBHIFI_AUDIO_MSG)
258+
gPowerManager->setPowerState(0);
259+
260+
log_i("set power state POWER_STATE_ON ");
261+
if(mPlayerEventInterface != NULL)
262+
mPlayerEventInterface->onKeyDispatch(result,VM_MEDIA,0);
263+
}
264+
}
265+
}
266+
log_i("SocketDetect::DetectRun Exit");
267+
}
268+
269+
#endif
270+
};

apps/player/KernelMsgGet.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
namespace mango
3+
{
4+
class KernelMsgGet{
5+
int mFd;
6+
7+
Thread mDetectThread;
8+
UseEventInterface *mPlayerEventInterface;
9+
public:
10+
CString mAudioBuf;
11+
12+
KernelMsgGet();
13+
~KernelMsgGet();
14+
int SocketInit();
15+
void DetectRun();
16+
static unsigned int DetectLoop(void* p);
17+
void setPlayerEventInterface(UseEventInterface *inter){mPlayerEventInterface=inter;}
18+
};
19+
20+
};

apps/player/MedaiPlayerService.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ namespace particle
5959
mGaplessDuration = 0;
6060

6161
mAudioChunnel = 0;
62+
63+
mVolume = 128;
6264
}
6365

6466
MediaPlayerService::~MediaPlayerService()
@@ -523,15 +525,18 @@ namespace particle
523525
{
524526
if (mPlayer)
525527
mPlayer->setAudioVolume(volume);
528+
529+
mVolume = volume;
526530
}
527531

528532

529533
int MediaPlayerService::getAudioVolume()
530534
{
531-
if (mPlayer)
532-
return mPlayer->getAudioVolume();
533-
else
534-
return -1;
535+
//if (mPlayer)
536+
// return mPlayer->getAudioVolume();
537+
//else
538+
// return -1;
539+
return mVolume;
535540
}
536541

537542

@@ -643,7 +648,10 @@ namespace particle
643648

644649
if (mAudioChunnel != 0)
645650
mPlayer->selectAudioChunnel(mAudioChunnel);
646-
651+
652+
653+
mPlayer->setAudioVolume(mVolume);
654+
647655

648656
mPlayer->setIsPlayingAddress(&gMediaServiceData->mIsPlaying);
649657
mPlayer->setCurrentPositionAddress(&gMediaServiceData->mCurrentPosition);
@@ -723,3 +731,5 @@ namespace particle
723731
}
724732

725733
};
734+
735+

apps/player/MediaPlayerService.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ namespace particle
115115
int mOutMinSampleRate;
116116
int mGaplessDuration;
117117
int mAudioChunnel;
118+
int mVolume;
118119
particle::Mutex mMutex;
119120
};
120121
};

0 commit comments

Comments
 (0)