From: liangzhenying <867174124@qq.com> Date: Sun, 27 Apr 2025 08:05:56 +0000 (+0800) Subject: M8蓝牙替换音频转码库 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=d0a1a01a4feee3d4ae96c5327db599d673ce3b7e;p=mirrors%2FMouseSdk-MacOS.git M8蓝牙替换音频转码库 --- diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/project.pbxproj b/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/project.pbxproj index 6ec82ff..aec594a 100644 --- a/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/project.pbxproj +++ b/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/project.pbxproj @@ -425,6 +425,10 @@ 18EF7B032C7603E800AC5223 /* TlwMouseSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AF42C7603E800AC5223 /* TlwMouseSdk.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18EF7B042C7603E800AC5223 /* AdpcmConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AF52C7603E800AC5223 /* AdpcmConverter.m */; }; 18EF7B052C7603E800AC5223 /* AiConnectManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AF62C7603E800AC5223 /* AiConnectManager.h */; }; + 3F434F9A2DBE0B3200D78C36 /* ima_adpcm_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 3F434F982DBE0B3200D78C36 /* ima_adpcm_dec.c */; }; + 3F434F9B2DBE0B3200D78C36 /* ima_decode_api.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F434F992DBE0B3200D78C36 /* ima_decode_api.h */; }; + 3F434F9C2DBE0B3200D78C36 /* ima_decode_api.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F434F992DBE0B3200D78C36 /* ima_decode_api.h */; }; + 3F434F9D2DBE0B3200D78C36 /* ima_adpcm_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 3F434F982DBE0B3200D78C36 /* ima_adpcm_dec.c */; }; 3F985CFA2DB34D0F008D6D73 /* DeviceTool.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F985CF82DB34D0F008D6D73 /* DeviceTool.h */; }; 3F985CFB2DB34D0F008D6D73 /* DeviceTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F985CF92DB34D0F008D6D73 /* DeviceTool.m */; }; 3F985CFC2DB34D0F008D6D73 /* DeviceTool.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F985CF82DB34D0F008D6D73 /* DeviceTool.h */; }; @@ -667,6 +671,8 @@ 18EF7AF42C7603E800AC5223 /* TlwMouseSdk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwMouseSdk.h; sourceTree = ""; }; 18EF7AF52C7603E800AC5223 /* AdpcmConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdpcmConverter.m; sourceTree = ""; }; 18EF7AF62C7603E800AC5223 /* AiConnectManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AiConnectManager.h; sourceTree = ""; }; + 3F434F982DBE0B3200D78C36 /* ima_adpcm_dec.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ima_adpcm_dec.c; sourceTree = ""; }; + 3F434F992DBE0B3200D78C36 /* ima_decode_api.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ima_decode_api.h; sourceTree = ""; }; 3F5CE3E62D1E7BCA00A5628A /* libAiMouseSdk copy.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libAiMouseSdk copy.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3F985CF82DB34D0F008D6D73 /* DeviceTool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeviceTool.h; sourceTree = ""; }; 3F985CF92DB34D0F008D6D73 /* DeviceTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DeviceTool.m; sourceTree = ""; }; @@ -1152,6 +1158,8 @@ 3FF3D7362DAE442C008EBA5D /* M8MouseSdk.m */, 3FF3D75A2DAFA0BC008EBA5D /* M8MouseInfo.h */, 3FF3D75B2DAFA0BC008EBA5D /* M8MouseInfo.m */, + 3F434F982DBE0B3200D78C36 /* ima_adpcm_dec.c */, + 3F434F992DBE0B3200D78C36 /* ima_decode_api.h */, ); path = M8; sourceTree = ""; @@ -1178,6 +1186,7 @@ 180E7CBF2BD8FC4E008558E8 /* opt.h in Headers */, 184A710E2BDA4C050025A332 /* AFCompatibilityMacros.h in Headers */, 180E7CAD2BD8FC4E008558E8 /* attributes.h in Headers */, + 3F434F9B2DBE0B3200D78C36 /* ima_decode_api.h in Headers */, 18AD83252BFAE8B9009BDE3B /* AiDeviceInfoManager.h in Headers */, 180E7C932BD8FC4E008558E8 /* murmur3.h in Headers */, 1888148E2C85766B009299A9 /* AiDeviceAuthManager.h in Headers */, @@ -1371,6 +1380,7 @@ 18862B272C806BD900D3564D /* tree.h in Headers */, 18862B282C806BD900D3564D /* hwcontext_mediacodec.h in Headers */, 18862B292C806BD900D3564D /* AiAudioDecoder.h in Headers */, + 3F434F9C2DBE0B3200D78C36 /* ima_decode_api.h in Headers */, 18862B2A2C806BD900D3564D /* encryption_info.h in Headers */, 3FCF53512D1A5C97007EC52F /* LogManager.h in Headers */, 18862B2B2C806BD900D3564D /* blowfish.h in Headers */, @@ -1595,6 +1605,7 @@ 3F9FA6712DB5E21C003B1012 /* HidTools.m in Sources */, 184A710A2BDA4C050025A332 /* AFURLRequestSerialization.m in Sources */, 184A71062BDA4C050025A332 /* AFURLResponseSerialization.m in Sources */, + 3F434F9A2DBE0B3200D78C36 /* ima_adpcm_dec.c in Sources */, 184A710C2BDA4C050025A332 /* AFNetworkReachabilityManager.m in Sources */, 180E7BE42BD7BD84008558E8 /* AiRecordManager.m in Sources */, 18EF7B042C7603E800AC5223 /* AdpcmConverter.m in Sources */, @@ -1637,6 +1648,7 @@ 18862BB32C806BD900D3564D /* AiSecretModel.m in Sources */, 18862BB42C806BD900D3564D /* AiSender.m in Sources */, 18862BB52C806BD900D3564D /* AiTrippleModel.m in Sources */, + 3F434F9D2DBE0B3200D78C36 /* ima_adpcm_dec.c in Sources */, 18862BB62C806BD900D3564D /* AiMouseSdk.m in Sources */, 188814912C85766B009299A9 /* AiDeviceAuthManager.m in Sources */, 18862BB82C806BD900D3564D /* AFHTTPSessionManager.m in Sources */, diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist b/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist index 64bd978..27157b9 100644 --- a/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ AiMouseSdk copy.xcscheme_^#shared#^_ orderHint - 2 + 4 AiMouseSdk.xcscheme_^#shared#^_ diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/AiDeviceInfoManager.m b/MouseSdk/AiMouseSdk/AiMouseSdk/AiDeviceInfoManager.m index 5f5dc6f..2a2a60f 100644 --- a/MouseSdk/AiMouseSdk/AiMouseSdk/AiDeviceInfoManager.m +++ b/MouseSdk/AiMouseSdk/AiMouseSdk/AiDeviceInfoManager.m @@ -524,9 +524,6 @@ NSString *cmd = [NSString stringWithFormat:@"-$$%@$$-\n",str]; [self sendToBle:cmd]; } - -// self.sendToBleBlock([TlwTools hexStringToData:@"052D24247B22636D64223A226765745F4D414300"]); -// self.sendToBleBlock([TlwTools hexStringToData:@"05227D24242D0000000000000000000000000000"]); } - (void)sendToBle:(NSString *)cmd{ NSData *data = [cmd dataUsingEncoding:NSUTF8StringEncoding]; @@ -534,21 +531,6 @@ self.sendToBleBlock(data); } } -//- (void)sendToBle:(NSString *)cmd{ -// NSData *data = [cmd dataUsingEncoding:NSUTF8StringEncoding]; -// -// NSMutableData *fullData = [[NSMutableData alloc] init]; -// -// uint8_t head[] = { 0x05}; -// uint8_t tail[] = {0x00}; -// [fullData appendBytes:&head length:1]; -// [fullData appendData:data]; -// [fullData appendBytes:&tail length:1]; -// -// if (self.sendToBleBlock) { -// self.sendToBleBlock(fullData); -// } -//} //切割 - (NSArray *)splitCMD:(NSString *)cmd{ diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.h b/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.h index 9bb06cf..f97cdef 100644 --- a/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.h +++ b/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.h @@ -76,6 +76,7 @@ typedef NS_ENUM(NSInteger,AiMouseConnectType) { @property (nonatomic, weak) id delegate;/// 代理 @property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型 @property (nonatomic, assign) BOOL connected;//是否已连接 +@property (nonatomic, assign) BOOL tlw2;//是否是泰凌微2代 /// 单利 +(AiMouse *)shared; diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.m b/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.m index bd3f24f..dc147c6 100644 --- a/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.m +++ b/MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.m @@ -22,6 +22,7 @@ #import "ByteDanceSdk.h" #import "DeviceManger.h" #import "AiConnectManager.h" +#import "TlwTools.h" @implementation ByteDanceInfo @end @@ -72,9 +73,7 @@ __weak typeof(self) ws = self; _deviceInfoManager.sendToBleBlock = ^(NSData * _Nonnull data) { if (ws.delegate) { - [ws showLog:[NSString stringWithFormat:@"[send][info]%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]]]; - [ws showLog:[NSString stringWithFormat:@"[send][info]%@",[AiMouseTools dataToHexString:data]]]; - [ws.delegate aiMouseSendDeviceInfoData:data]; + [ws sendToBle:data]; } }; _deviceInfoManager.outputLogBlock = ^(NSString * _Nonnull log) { @@ -116,28 +115,28 @@ if (!_connectdManager) { _connectdManager = [[AiConnectManager alloc] init]; __weak typeof(self) ws = self; -// _connectdManager.needSendToBleCallBack = ^{ -// [ws.deviceInfoManager getVersion:^(NSString * _Nonnull version, NSError * _Nonnull error) { -// -// }]; -// }; -// _connectdManager.didDisConnectedCallBack = ^{ -// [ws switchConnect:AiMouseConnectType_hid isConnected:false]; -// }; + // _connectdManager.needSendToBleCallBack = ^{ + // [ws.deviceInfoManager getVersion:^(NSString * _Nonnull version, NSError * _Nonnull error) { + // + // }]; + // }; + // _connectdManager.didDisConnectedCallBack = ^{ + // [ws switchConnect:AiMouseConnectType_hid isConnected:false]; + // }; } return _connectdManager; } #pragma mark - pub Api - (void)didDisconnect{ [self stopRecord:true]; -// [self.connectManager disConnected]; + // [self.connectManager disConnected]; } - (void)switchConnect:(AiMouseConnectType)type isConnected:(BOOL)isConneted{ if(isConneted ){ _connected = true; _connectType = type; [self showLog:type == AiMouseConnectType_bluetooth?@"sdk切换到蓝牙模式":@"sdk切换到usb模式"]; - + if (type == AiMouseConnectType_hid ) { [self.recordManager checkPermissions]; } @@ -148,12 +147,12 @@ [ws switchConnect:ws.connectType isConnected:false]; return; } -// if (([DeviceManger shared].appType == 2 || [DeviceManger shared].appType == 4) ) { -// [[ByteDanceSdk shared] startAuth:^(ByteDanceInfo *info) { -// deviceInfo.byteAuthInfo = info; -// [ws showLog:deviceInfo.description]; -// }]; -// } + // if (([DeviceManger shared].appType == 2 || [DeviceManger shared].appType == 4) ) { + // [[ByteDanceSdk shared] startAuth:^(ByteDanceInfo *info) { + // deviceInfo.byteAuthInfo = info; + // [ws showLog:deviceInfo.description]; + // }]; + // } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ if([ws.delegate respondsToSelector:@selector(aiMouseConnectStateDidChange:)]) [ws.delegate aiMouseConnectStateDidChange:ws.connected]; if(ws.delegate) [ws.delegate aiMouseAuthenticationResult:true]; @@ -176,13 +175,13 @@ [self showLog:[NSString stringWithFormat:@"[receive][Voice] %@",data]]; if(self.connectType == AiMouseConnectType_hid){ -// 0AFFFF12BC32 + // 0AFFFF12BC32 if(data.length == 6){ NSData *subData = [data subdataWithRange:NSMakeRange(5, 1)]; [self sendCmdData:subData]; uint8 cmd; [subData getBytes:&cmd length:1]; -// [self showLog:[NSString stringWithFormat:@"cmd = %X",cmdInt]]; + // [self showLog:[NSString stringWithFormat:@"cmd = %X",cmdInt]]; if(cmd == 0x31 || cmd == 0x21 || cmd == 0x25 ||cmd == 0x27){ self.recordManager.startCmd = subData; [self startRecord]; @@ -210,7 +209,7 @@ else{ NSData *pcm = [AdpcmConverter toPcm:data]; [self sendRecordData:pcm]; -// [self showLog:@"未实现指令"]; + // [self showLog:@"未实现指令"]; } } } @@ -228,7 +227,7 @@ } [self showLog:[NSString stringWithFormat:@"[receive][info] %@",[AiMouseTools dataToHexString:data]]]; [self showLog:[NSString stringWithFormat:@"[receive][info] %@",[AiMouseTools dataToUtf8String:data]]]; - + if ([DeviceManger shared].appType == 2 || [DeviceManger shared].appType == 4) { if([self.deviceInfoManager receiveData:data]){ @@ -336,7 +335,7 @@ } #pragma mark - other - (void)sendRecordData:(NSData *)data{ -// [self showLog:[NSString stringWithFormat:@"[audio] %@",data]]; + // [self showLog:[NSString stringWithFormat:@"[audio] %@",data]]; if ([DeviceManger shared].appType == 2 || [DeviceManger shared].appType == 4) { [self.voiceData appendData:data]; if (self.voiceData.length > 5000) { @@ -349,7 +348,7 @@ } } - (void)sendCmdData:(NSData *)data{ - [self showLog:[NSString stringWithFormat:@"[send] %@",data]]; +// [self showLog:[NSString stringWithFormat:@"[send] %@",data]]; if (self.delegate) [self.delegate aiMouseSendCmdData:data]; } @@ -361,26 +360,41 @@ #pragma mark - deviceInfo - (void)startRecord{ -// [self showLog:@"开始录音"]; + // [self showLog:@"开始录音"]; [self.recordManager start]; self.voiceData = [[NSMutableData alloc] init]; } - (void)stopRecord:(BOOL)sendCmd{ - if (self.recordManager.recording ) { - [self.recordManager stop]; - } - if (sendCmd) { - [self sendCmdData:self.recordManager.stopCmd]; - } -// [self showLog:@"结束录音"]; + if (self.recordManager.recording ) { + [self.recordManager stop]; + } + if (sendCmd) { + [self sendCmdData:self.recordManager.stopCmd]; + } } - (void)sendToBle:(NSData *)data{ - [self showLog:[NSString stringWithFormat:@"[send] %@",[AiMouseTools dataToHexString:data]]]; - if (self.delegate) { - [self.delegate aiMouseSendDeviceInfoData:data]; - }; + if(self.connectType == AiMouseConnectType_hid && self.tlw2){ + data = [TlwTools hexStringToData:@"11"]; +// data = [TlwTools hexStringToData:@"2D24247B22636D64223A226765745F4D4143"]; +// data = [TlwTools hexStringToData:@"227D24242D00000000000000000000000000"]; + NSMutableData *fullData = [[NSMutableData alloc] init]; + uint8_t head[] = { 0x05}; + uint8_t tail[] = {0x00}; + [fullData appendBytes:&head length:1]; + [fullData appendData:data]; + [fullData appendBytes:&tail length:1]; + [self showLog:[NSString stringWithFormat:@"[send][info]%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]]]; + [self showLog:[NSString stringWithFormat:@"[send] %@",fullData]]; + if (self.delegate) [self.delegate aiMouseSendDeviceInfoData:fullData]; + } + else{ + [self showLog:[NSString stringWithFormat:@"[send] %@",[AiMouseTools dataToHexString:data]]]; + if (self.delegate) { + [self.delegate aiMouseSendDeviceInfoData:data]; + }; + } } @end diff --git a/MouseSdk/AiMouseSdk/AiMouseSdk/AiSender.m b/MouseSdk/AiMouseSdk/AiMouseSdk/AiSender.m index a6a1543..8d72da0 100644 --- a/MouseSdk/AiMouseSdk/AiMouseSdk/AiSender.m +++ b/MouseSdk/AiMouseSdk/AiMouseSdk/AiSender.m @@ -73,7 +73,7 @@ - (void)timerAction{ self.number++; - if (self.number == 10) { + if (self.number == 1) { [self removeSendTimer]; if (self.delegate && [self.delegate respondsToSelector:@selector(aiSenderRecieveTimeOut:)]) { [self.delegate aiSenderRecieveTimeOut:self]; diff --git a/MouseSdk/AiMouseSdk/M8/M8MouseSdk.m b/MouseSdk/AiMouseSdk/M8/M8MouseSdk.m index b681e10..34fccd2 100644 --- a/MouseSdk/AiMouseSdk/M8/M8MouseSdk.m +++ b/MouseSdk/AiMouseSdk/M8/M8MouseSdk.m @@ -10,6 +10,7 @@ #import "TlwTools.h" #import "AiRecordManager.h" #import "M8MouseInfo.h" +#include "ima_decode_api.h" @interface M8MouseSdk() @property (nonatomic, strong) AiRecordManager *recordManager; @@ -173,10 +174,10 @@ } - (void)convertToPcm{ - if (self.voiceData.length >= 128) { - NSData *subData = [self.voiceData subdataWithRange:NSMakeRange(0, 128)]; - NSData *pcm = [AdpcmConverter toPcm:subData]; - self.voiceData = [NSMutableData dataWithData:[self.voiceData subdataWithRange:NSMakeRange(128, self.voiceData.length - 128)]]; + if (self.voiceData.length >= 390) { + NSData *subData = [self.voiceData subdataWithRange:NSMakeRange(0, 390)]; + NSData *pcm = [self toPcm:subData]; + self.voiceData = [NSMutableData dataWithData:[self.voiceData subdataWithRange:NSMakeRange(390, self.voiceData.length - 390)]]; [self sendRecordData:pcm]; [self convertToPcm]; } @@ -332,4 +333,49 @@ NSString *replacedString = [text stringByReplacingOccurrencesOfString:@"\0" withString:@"0"]; return replacedString; } + +- (NSData *)toPcm:(NSData *)adpcmData { +// const unsigned char *adpcmBytes = (const unsigned char *)[adpcmData bytes]; +// NSUInteger adpcmLength = [adpcmData length]; +// +// signed short *ps = (signed short *)malloc(adpcmLength); +// memcpy(ps, adpcmBytes, adpcmLength); +// +// signed short *pd = (signed short *)malloc(384*2); +// +// audio_sw_decoder_pcm(ps, pd, 390); +// +// NSData *pcmData = [NSData dataWithBytes:pd length:768]; +// +// free(ps); +// free(pd); +// +// return pcmData; + + NSUInteger fileSize = adpcmData.length; + const char *indata = (const char *)adpcmData.bytes; + NSUInteger num = fileSize / 390; + // 分配输出数据的内存 + short *outdata = (short *)malloc(384 * 2 * num * sizeof(short)); + if (outdata == NULL) { + return [NSData data]; + } + char block[390]; + short out[384 * 2]; + for (NSUInteger i = 0; i < num; i++) { + // 复制数据块 + memcpy(block, indata + 390 * i, 390); + audio_sw_decoder_pcm(block, 390, out); + for (NSUInteger j = 0; j < (384 * 2); j++) { + outdata[(384 * 2 * i + j)] = out[j]; + } + } + + NSUInteger size = 384 * 2 * num; + // 将解码后的数据写入文件 + NSData *outputData = [NSData dataWithBytes:outdata length:size * sizeof(short)]; + // 释放内存 + free(outdata); + return outputData; +} @end diff --git a/MouseSdk/AiMouseSdk/M8/ima_adpcm_dec.c b/MouseSdk/AiMouseSdk/M8/ima_adpcm_dec.c new file mode 100644 index 0000000..35105e5 --- /dev/null +++ b/MouseSdk/AiMouseSdk/M8/ima_adpcm_dec.c @@ -0,0 +1,160 @@ +#include "ima_decode_api.h" +//#include +//#include +//#include +//#include + +/* Intel ADPCM step variation table */ +const static int ima_indexTable[16] = { + -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8, +}; + +const static int ima_stepsizeTable[89] = { + 7, 8, 9, 10, 11, 12, 13, 14, + 16, 17, 19, 21, 23, 25, 28, 31, + 34, 37, 41, 45, 50, 55, 60, 66, + 73, 80, 88, 97, 107, 118, 130, 143, + 157, 173, 190, 209, 230, 253, 279, 307, + 337, 371, 408, 449, 494, 544, 598, 658, + 724, 796, 876, 963, 1060, 1166, 1282, 1411, + 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, + 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, + 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, + 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, + 32767 +}; + +static void ima_adpcm_decoder_unit(unsigned char delta, int *valpred, int *index) +{ + int sign; + int step; + int vpdiff; + + step = ima_stepsizeTable[(*index)]; + + vpdiff = 0; + if (delta & 4) vpdiff += step; + if (delta & 2) vpdiff += (step >> 1); + if (delta & 1) vpdiff += (step >> 2); + vpdiff += (step >> 3); + sign = delta & 8; + if (sign) + *valpred -= vpdiff; + else + *valpred += vpdiff; + + if (*valpred > 32767) + *valpred = 32767; + else if (*valpred < -32768) + *valpred = -32768; + + (*index) += ima_indexTable[delta]; + if ((*index) < 0) + (*index) = 0; + if ((*index) > 88) + (*index) = 88; +} + +static void ima_adpcm_decoder_noheader(char *indata, short *outdata, int *index, int *valpred, short len) +{ + int inputbuffer; + char delta[12]; + short *outp; + char *inp; + int i, j; + short handle_len = len / 2; + outp = outdata; + inp = indata; + for ( i = 0; i < handle_len; i++ ) + { + inputbuffer = *inp++; + delta[0] = inputbuffer & 0xF; + delta[1] = (inputbuffer >> 4) & 0xF; + for ( j = 0; j < 2; j++ ) + { + ima_adpcm_decoder_unit(delta[j], valpred, index); + *outp++ = *(short *)valpred; + + //printf("%hd-%d, ", *valpred, *index); + } + } +} + +int audio_sw_decoder_pcm(unsigned char indata[], int len, unsigned short *outdata) +{ + int valpred; + int index; + + index = (int)*(char *)(indata + 5); + valpred = ((int)*(char *)(indata + 3) << 8) + (int)*(char *)(indata + 4); + if ( valpred >> 15 == 1 ) + valpred |= 0xFFFF0000; + + //printf("index: %d, valpred: %d\n", index, valpred); + + ima_adpcm_decoder_noheader(indata + 6, outdata, &index, &valpred, (len - 6) * 2); + return (len - 6) * 4; +} + +/* +int main() +{ + int file_size; + FILE *file; + + file = fopen("t3.adpcm", "rb"); + fseek(file, 0, SEEK_END); + file_size = ftell(file); + + printf("file_size: %d\n", file_size); + char indata[file_size]; + + rewind(file); + fread(indata, file_size, 1, file); + fclose(file); + + int len = sizeof(indata); + //short outdata[(len - 6) * 2]; + + printf("indata len: %d\n", len); + + //-------------------- + int num = len / 390; + + printf("block num: %d\n", num); + + int i,j; + short outdata[384 * 2 * num]; + char block[390]; + short out[384*2]; + for ( i = 0; i < num; i++ ) + { + printf("block from: %d\n", 390*i); + + strncpy(block, indata + 390*i, 390); + audio_sw_decoder_pcm(block, 390, out); + + for ( j = 0; j < (384*2); j++ ) + { + outdata[(384*2*i + j)] = out[j]; + } + } + + //audio_sw_decoder_pcm(indata, len, outdata); + //decoder(indata, len, outdata); + + //------------------- + + int size = sizeof(outdata)/sizeof(outdata[0]); + printf("outdata size: %d\n", size); + + file = fopen("data.pcm", "wb"); + fwrite(outdata, sizeof(short), size, file); + fclose(file); + + free(outdata); + printf("ok"); + return 0; +} +*/ \ No newline at end of file diff --git a/MouseSdk/AiMouseSdk/M8/ima_decode_api.h b/MouseSdk/AiMouseSdk/M8/ima_decode_api.h new file mode 100644 index 0000000..092a078 --- /dev/null +++ b/MouseSdk/AiMouseSdk/M8/ima_decode_api.h @@ -0,0 +1,5 @@ +#pragma once + +int audio_sw_decoder_pcm(unsigned char indata[], int len, unsigned short outdata[]); + + diff --git a/MouseSdk/AiMouseSdk/Manager/BleManager.m b/MouseSdk/AiMouseSdk/Manager/BleManager.m index 933b4e9..fd44b4a 100644 --- a/MouseSdk/AiMouseSdk/Manager/BleManager.m +++ b/MouseSdk/AiMouseSdk/Manager/BleManager.m @@ -145,8 +145,7 @@ [peripheral setNotifyValue:YES forCharacteristic:characteristic]; self.productType = AiMouseProductType_tlw; // 使用dispatch_after来延迟执行任务 - dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC); - dispatch_after(delayTime, dispatch_get_main_queue(), ^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [self showLog:[NSString stringWithFormat:@"连接成功 = %@",peripheral.name]]; self.connectStateCallBack(self.curentPeripheral.name,true); }); @@ -179,20 +178,6 @@ else if ([characteristic.UUID.UUIDString isEqualToString:@"2A28"]) { [self showLog:[NSString stringWithFormat:@"Software Revision = %@",[TlwTools dataToUtf8String:characteristic.value]]]; } - // else if ([characteristic.UUID.UUIDString isEqualToString:@"2A27"]) { - // [self showLog:[NSString stringWithFormat:@"Hardware Revision = %@",[TlwTools dataToUtf8String:characteristic.value]]]; - // } - // - - // else if ([characteristic.UUID.UUIDString isEqualToString:@"2A23"]) { - // [self showLog:[NSString stringWithFormat:@"System ID = %@",[TlwTools dataToUtf8String:characteristic.value]]]; - // } - // else if ([characteristic.UUID.UUIDString isEqualToString:@"2A2A"]) { - // [self showLog:[NSString stringWithFormat:@"PnP ID = %@",[TlwTools dataToUtf8String:characteristic.value]]]; - // } - // else if ([characteristic.UUID.UUIDString isEqualToString:@"2A29"]) { - // [self showLog:[NSString stringWithFormat:@"Manufacturer Name = %@",[TlwTools dataToUtf8String:characteristic.value]]]; - // } else if ([characteristic.UUID.UUIDString isEqualToString:kM8ClickUUID]) { [peripheral setNotifyValue:YES forCharacteristic:characteristic]; } diff --git a/MouseSdk/AiMouseSdk/Manager/DeviceManger.h b/MouseSdk/AiMouseSdk/Manager/DeviceManger.h index 398d31f..75ddbcd 100644 --- a/MouseSdk/AiMouseSdk/Manager/DeviceManger.h +++ b/MouseSdk/AiMouseSdk/Manager/DeviceManger.h @@ -116,7 +116,7 @@ NS_ASSUME_NONNULL_BEGIN /// - finished: 执行结果回调 - (void)closeRecord:(void (^)(BOOL isSuccess,NSError *error))finished; - +- (void)startConnect; @end NS_ASSUME_NONNULL_END diff --git a/MouseSdk/AiMouseSdk/Manager/DeviceManger.m b/MouseSdk/AiMouseSdk/Manager/DeviceManger.m index 4d6c738..78202c0 100644 --- a/MouseSdk/AiMouseSdk/Manager/DeviceManger.m +++ b/MouseSdk/AiMouseSdk/Manager/DeviceManger.m @@ -101,6 +101,15 @@ }; } +- (void)startConnect{ + if(self.kbSdk.connected || self.nSdk.connected || self.tlwSdk.connected || self.frkSdk.connected|| self.m8Sdk.connected){ + // [self.hid close]; + } + else{ + [self.ble open]; + [self.hid open]; + } +} - (void)setupHid{ self.hid = [HidManager shared]; diff --git a/MouseSdk/AiMouseSdk/Manager/HidManager.m b/MouseSdk/AiMouseSdk/Manager/HidManager.m index 96cec0e..0a09a9a 100644 --- a/MouseSdk/AiMouseSdk/Manager/HidManager.m +++ b/MouseSdk/AiMouseSdk/Manager/HidManager.m @@ -103,6 +103,7 @@ static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOH } else if(vid == 0x6675 && pid == 0x8601){ [HidManager shared].productType = AiMouseProductType_frk; + AiMouse.shared.tlw2 = false; if(page == 1 && usage == 0){ unsigned char InputBuffer[128]; IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL); @@ -141,25 +142,27 @@ static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOH } else if(vid == 0x6675 && pid == 0x8602){ [HidManager shared].productType = AiMouseProductType_frk; - if(page == 1 && usage == 2){ - unsigned char InputBuffer[128]; - IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL); - - IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone); - if (result != kIOReturnSuccess) { - [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备信息失败! %d",result]]; - [[AiDeviceAuthManager shared] showHidAlert]; - return; - }else{ - [HidManager shared].deviceInfoCha = inIOHIDDeviceRef; - - [[HidManager shared] showLog:@"打开设备信息成功!"]; - if([HidManager shared].voiceCha != nil){ - [HidManager shared].connectStateCallBack(true); - } - } - } - else if(page == 65519 && usage == 0){ + AiMouse.shared.tlw2 = true; +// if(page == 1 && usage == 2){ +// unsigned char InputBuffer[128]; +// IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL); +// +// IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone); +// if (result != kIOReturnSuccess) { +// [[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备信息失败! %d",result]]; +// [[AiDeviceAuthManager shared] showHidAlert]; +// return; +// }else{ +// [HidManager shared].deviceInfoCha = inIOHIDDeviceRef; +// +// [[HidManager shared] showLog:@"打开设备信息成功!"]; +// if([HidManager shared].voiceCha != nil){ +// [HidManager shared].connectStateCallBack(true); +// } +// } +// } +// else + if(page == 65519 && usage == 0){ unsigned char InputBuffer[128]; IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL); @@ -169,7 +172,7 @@ static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOH [[AiDeviceAuthManager shared] showHidAlert]; return; }else{ - [HidManager shared].voiceCha = inIOHIDDeviceRef; + [HidManager shared].deviceInfoCha = inIOHIDDeviceRef; [[HidManager shared] showLog:@"打开设备voice成功!"]; if([HidManager shared].deviceInfoCha != nil){ @@ -295,7 +298,7 @@ static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDRe [self showLog:@"sendData: 请先连上设备"]; return; } - +// data = [self addFullData:data]; [self showLog:[NSString stringWithFormat:@"[send] %@ %@",self.deviceInfoCha,data]]; IOReturn ret = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeOutput, 0, data.bytes, data.length); if (ret != kIOReturnSuccess) { @@ -305,6 +308,17 @@ static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDRe } } +- (NSData *)addFullData:(NSData *)data{ + NSMutableData *fullData = [[NSMutableData alloc] initWithData:data]; + if (fullData.length < 64) { + NSInteger len = 64 - fullData.length; + for (NSInteger i = 0; i < len; i++) { + uint8_t d = 0x00; + [fullData appendBytes:&d length:1]; + } + } + return fullData; +} - (void)showLog:(NSString *)log{ NSString *text = [NSString stringWithFormat:@"[HidManager]%@",log]; diff --git a/MouseSdk/AiMouseSdk/Manager/TimerManager.m b/MouseSdk/AiMouseSdk/Manager/TimerManager.m index 556807b..bfe9912 100644 --- a/MouseSdk/AiMouseSdk/Manager/TimerManager.m +++ b/MouseSdk/AiMouseSdk/Manager/TimerManager.m @@ -32,7 +32,7 @@ // [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; // [[NSRunLoop currentRunLoop] run]; // }); - self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true]; + self.timer = [NSTimer scheduledTimerWithTimeInterval:5000 target:self selector:@selector(timerAction) userInfo:nil repeats:true]; } - (void)timerAction{ diff --git a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate index bc0b41f..194ce2d 100644 Binary files a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate and b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e220d4b..910b871 100644 --- a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -7,33 +7,17 @@ - - - - + startingLineNumber = "247" + endingLineNumber = "247" + landmarkName = "-startScan" + landmarkType = "7"> diff --git a/MouseSdk/MouseSdk/ViewController.m b/MouseSdk/MouseSdk/ViewController.m index d4282c0..09545af 100644 --- a/MouseSdk/MouseSdk/ViewController.m +++ b/MouseSdk/MouseSdk/ViewController.m @@ -43,6 +43,15 @@ [self.view addSubview:backgroundView]; self.title = @"AI SDK"; + { + NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 100, 100, 45)]; + btn.bordered = true; + btn.title = @"连接"; + [btn setTarget:self]; + [btn setAction:@selector(connectAction:)]; + btn.state = 1; + [self.view addSubview:btn]; + } { NSButton *btn = [[NSButton alloc]initWithFrame:NSMakeRect(50, self.view.bounds.size.height - 200, 100, 45)]; btn.bordered = true; @@ -130,6 +139,9 @@ }; } +- (void)connectAction:(NSButton *)sender { + [[DeviceManger shared] startConnect]; +} - (void)moreAction:(NSButton *)sender { NSMenu *popupMenu = [[NSMenu alloc] initWithTitle:@"Popup Menu"]; diff --git a/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist b/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist index 30f1cdd..a1cc8f6 100644 --- a/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ Pods-MouseSdk.xcscheme_^#shared#^_ orderHint - 4 + 2