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 */; };
18EF7AF42C7603E800AC5223 /* TlwMouseSdk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwMouseSdk.h; sourceTree = "<group>"; };
18EF7AF52C7603E800AC5223 /* AdpcmConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdpcmConverter.m; sourceTree = "<group>"; };
18EF7AF62C7603E800AC5223 /* AiConnectManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AiConnectManager.h; sourceTree = "<group>"; };
+ 3F434F982DBE0B3200D78C36 /* ima_adpcm_dec.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ima_adpcm_dec.c; sourceTree = "<group>"; };
+ 3F434F992DBE0B3200D78C36 /* ima_decode_api.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ima_decode_api.h; sourceTree = "<group>"; };
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 = "<group>"; };
3F985CF92DB34D0F008D6D73 /* DeviceTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DeviceTool.m; sourceTree = "<group>"; };
3FF3D7362DAE442C008EBA5D /* M8MouseSdk.m */,
3FF3D75A2DAFA0BC008EBA5D /* M8MouseInfo.h */,
3FF3D75B2DAFA0BC008EBA5D /* M8MouseInfo.m */,
+ 3F434F982DBE0B3200D78C36 /* ima_adpcm_dec.c */,
+ 3F434F992DBE0B3200D78C36 /* ima_decode_api.h */,
);
path = M8;
sourceTree = "<group>";
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 */,
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 */,
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 */,
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 */,
<key>AiMouseSdk copy.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
- <integer>2</integer>
+ <integer>4</integer>
</dict>
<key>AiMouseSdk.xcscheme_^#shared#^_</key>
<dict>
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];
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<NSString *> *)splitCMD:(NSString *)cmd{
@property (nonatomic, weak) id<AiMouseDelegate> delegate;/// 代理
@property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型
@property (nonatomic, assign) BOOL connected;//是否已连接
+@property (nonatomic, assign) BOOL tlw2;//是否是泰凌微2代
/// 单利
+(AiMouse *)shared;
#import "ByteDanceSdk.h"
#import "DeviceManger.h"
#import "AiConnectManager.h"
+#import "TlwTools.h"
@implementation ByteDanceInfo
@end
__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) {
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];
}
[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];
[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];
else{
NSData *pcm = [AdpcmConverter toPcm:data];
[self sendRecordData:pcm];
-// [self showLog:@"未实现指令"];
+ // [self showLog:@"未实现指令"];
}
}
}
}
[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]){
}
#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) {
}
}
- (void)sendCmdData:(NSData *)data{
- [self showLog:[NSString stringWithFormat:@"[send] %@",data]];
+// [self showLog:[NSString stringWithFormat:@"[send] %@",data]];
if (self.delegate) [self.delegate aiMouseSendCmdData:data];
}
#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
- (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];
#import "TlwTools.h"
#import "AiRecordManager.h"
#import "M8MouseInfo.h"
+#include "ima_decode_api.h"
@interface M8MouseSdk()
@property (nonatomic, strong) AiRecordManager *recordManager;
}
- (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];
}
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
--- /dev/null
+#include "ima_decode_api.h"\r
+//#include <stdlib.h>\r
+//#include <string.h>\r
+//#include <stdio.h>\r
+//#include <windows.h>\r
+\r
+/* Intel ADPCM step variation table */\r
+const static int ima_indexTable[16] = {\r
+ -1, -1, -1, -1, 2, 4, 6, 8,\r
+ -1, -1, -1, -1, 2, 4, 6, 8,\r
+};\r
+\r
+const static int ima_stepsizeTable[89] = {\r
+ 7, 8, 9, 10, 11, 12, 13, 14,\r
+ 16, 17, 19, 21, 23, 25, 28, 31,\r
+ 34, 37, 41, 45, 50, 55, 60, 66,\r
+ 73, 80, 88, 97, 107, 118, 130, 143,\r
+ 157, 173, 190, 209, 230, 253, 279, 307,\r
+ 337, 371, 408, 449, 494, 544, 598, 658,\r
+ 724, 796, 876, 963, 1060, 1166, 1282, 1411,\r
+ 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,\r
+ 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484,\r
+ 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,\r
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794,\r
+ 32767\r
+};\r
+\r
+static void ima_adpcm_decoder_unit(unsigned char delta, int *valpred, int *index)\r
+{\r
+ int sign;\r
+ int step;\r
+ int vpdiff;\r
+\r
+ step = ima_stepsizeTable[(*index)];\r
+\r
+ vpdiff = 0;\r
+ if (delta & 4) vpdiff += step;\r
+ if (delta & 2) vpdiff += (step >> 1);\r
+ if (delta & 1) vpdiff += (step >> 2);\r
+ vpdiff += (step >> 3);\r
+ sign = delta & 8;\r
+ if (sign)\r
+ *valpred -= vpdiff;\r
+ else\r
+ *valpred += vpdiff;\r
+\r
+ if (*valpred > 32767)\r
+ *valpred = 32767;\r
+ else if (*valpred < -32768)\r
+ *valpred = -32768;\r
+\r
+ (*index) += ima_indexTable[delta];\r
+ if ((*index) < 0)\r
+ (*index) = 0;\r
+ if ((*index) > 88)\r
+ (*index) = 88;\r
+}\r
+\r
+static void ima_adpcm_decoder_noheader(char *indata, short *outdata, int *index, int *valpred, short len)\r
+{\r
+ int inputbuffer;\r
+ char delta[12];\r
+ short *outp;\r
+ char *inp;\r
+ int i, j;\r
+ short handle_len = len / 2;\r
+ outp = outdata;\r
+ inp = indata;\r
+ for ( i = 0; i < handle_len; i++ )\r
+ {\r
+ inputbuffer = *inp++;\r
+ delta[0] = inputbuffer & 0xF;\r
+ delta[1] = (inputbuffer >> 4) & 0xF;\r
+ for ( j = 0; j < 2; j++ )\r
+ {\r
+ ima_adpcm_decoder_unit(delta[j], valpred, index);\r
+ *outp++ = *(short *)valpred;\r
+ \r
+ //printf("%hd-%d, ", *valpred, *index);\r
+ }\r
+ }\r
+}\r
+\r
+int audio_sw_decoder_pcm(unsigned char indata[], int len, unsigned short *outdata)\r
+{\r
+ int valpred;\r
+ int index;\r
+ \r
+ index = (int)*(char *)(indata + 5);\r
+ valpred = ((int)*(char *)(indata + 3) << 8) + (int)*(char *)(indata + 4);\r
+ if ( valpred >> 15 == 1 )\r
+ valpred |= 0xFFFF0000;\r
+ \r
+ //printf("index: %d, valpred: %d\n", index, valpred);\r
+ \r
+ ima_adpcm_decoder_noheader(indata + 6, outdata, &index, &valpred, (len - 6) * 2);\r
+ return (len - 6) * 4;\r
+}\r
+\r
+/*\r
+int main()\r
+{\r
+ int file_size;\r
+ FILE *file;\r
+ \r
+ file = fopen("t3.adpcm", "rb");\r
+ fseek(file, 0, SEEK_END);\r
+ file_size = ftell(file);\r
+ \r
+ printf("file_size: %d\n", file_size);\r
+ char indata[file_size];\r
+ \r
+ rewind(file);\r
+ fread(indata, file_size, 1, file);\r
+ fclose(file);\r
+ \r
+ int len = sizeof(indata);\r
+ //short outdata[(len - 6) * 2];\r
+ \r
+ printf("indata len: %d\n", len);\r
+ \r
+ //--------------------\r
+ int num = len / 390;\r
+ \r
+ printf("block num: %d\n", num);\r
+ \r
+ int i,j;\r
+ short outdata[384 * 2 * num];\r
+ char block[390];\r
+ short out[384*2];\r
+ for ( i = 0; i < num; i++ )\r
+ {\r
+ printf("block from: %d\n", 390*i);\r
+ \r
+ strncpy(block, indata + 390*i, 390);\r
+ audio_sw_decoder_pcm(block, 390, out);\r
+ \r
+ for ( j = 0; j < (384*2); j++ )\r
+ {\r
+ outdata[(384*2*i + j)] = out[j];\r
+ }\r
+ }\r
+ \r
+ //audio_sw_decoder_pcm(indata, len, outdata);\r
+ //decoder(indata, len, outdata);\r
+ \r
+ //-------------------\r
+ \r
+ int size = sizeof(outdata)/sizeof(outdata[0]);\r
+ printf("outdata size: %d\n", size);\r
+ \r
+ file = fopen("data.pcm", "wb");\r
+ fwrite(outdata, sizeof(short), size, file);\r
+ fclose(file);\r
+ \r
+ free(outdata);\r
+ printf("ok");\r
+ return 0;\r
+}\r
+*/
\ No newline at end of file
--- /dev/null
+#pragma once\r
+\r
+int audio_sw_decoder_pcm(unsigned char indata[], int len, unsigned short outdata[]);\r
+\r
+\r
[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);
});
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];
}
/// - finished: 执行结果回调
- (void)closeRecord:(void (^)(BOOL isSuccess,NSError *error))finished;
-
+- (void)startConnect;
@end
NS_ASSUME_NONNULL_END
};
}
+- (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];
}
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);
}
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);
[[AiDeviceAuthManager shared] showHidAlert];
return;
}else{
- [HidManager shared].voiceCha = inIOHIDDeviceRef;
+ [HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
[[HidManager shared] showLog:@"打开设备voice成功!"];
if([HidManager shared].deviceInfoCha != nil){
[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) {
}
}
+- (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];
// [[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{
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
- uuid = "87BC2FCF-00F1-4152-AC63-EDC7366633B4"
- shouldBeEnabled = "Yes"
+ uuid = "A592D25F-B5C1-4A3A-A315-96D146FF8489"
+ shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
- filePath = "AiMouseSdk/Manager/HidManager.m"
+ filePath = "AiMouseSdk/Manager/BleManager.m"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
- startingLineNumber = "195"
- endingLineNumber = "195"
- landmarkName = "hidReceiveData(context, result, sender, type, reportID, report, reportLength)"
- landmarkType = "9">
- </BreakpointContent>
- </BreakpointProxy>
- <BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
- <BreakpointContent
- uuid = "5C5293B3-F708-43CE-86A8-6778210C6BFC"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- filePath = "AiMouseSdk/Manager/HidManager.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "228"
- endingLineNumber = "228"
- landmarkName = "hidReceiveData(context, result, sender, type, reportID, report, reportLength)"
- landmarkType = "9">
+ startingLineNumber = "247"
+ endingLineNumber = "247"
+ landmarkName = "-startScan"
+ landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
[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;
};
}
+- (void)connectAction:(NSButton *)sender {
+ [[DeviceManger shared] startConnect];
+}
- (void)moreAction:(NSButton *)sender {
NSMenu *popupMenu = [[NSMenu alloc] initWithTitle:@"Popup Menu"];
<key>Pods-MouseSdk.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
- <integer>4</integer>
+ <integer>2</integer>
</dict>
</dict>
</dict>