M8蓝牙替换音频转码库
authorliangzhenying <867174124@qq.com>
Sun, 27 Apr 2025 08:05:56 +0000 (16:05 +0800)
committerliangzhenying <867174124@qq.com>
Sun, 27 Apr 2025 08:05:56 +0000 (16:05 +0800)
18 files changed:
MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/project.pbxproj
MouseSdk/AiMouseSdk/AiMouseSdk.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist
MouseSdk/AiMouseSdk/AiMouseSdk/AiDeviceInfoManager.m
MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.h
MouseSdk/AiMouseSdk/AiMouseSdk/AiMouseSdk.m
MouseSdk/AiMouseSdk/AiMouseSdk/AiSender.m
MouseSdk/AiMouseSdk/M8/M8MouseSdk.m
MouseSdk/AiMouseSdk/M8/ima_adpcm_dec.c [new file with mode: 0644]
MouseSdk/AiMouseSdk/M8/ima_decode_api.h [new file with mode: 0644]
MouseSdk/AiMouseSdk/Manager/BleManager.m
MouseSdk/AiMouseSdk/Manager/DeviceManger.h
MouseSdk/AiMouseSdk/Manager/DeviceManger.m
MouseSdk/AiMouseSdk/Manager/HidManager.m
MouseSdk/AiMouseSdk/Manager/TimerManager.m
MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate
MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
MouseSdk/MouseSdk/ViewController.m
MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist

index 6ec82ff..aec594a 100644 (file)
                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 */,
index 64bd978..27157b9 100644 (file)
@@ -7,7 +7,7 @@
                <key>AiMouseSdk copy.xcscheme_^#shared#^_</key>
                <dict>
                        <key>orderHint</key>
-                       <integer>2</integer>
+                       <integer>4</integer>
                </dict>
                <key>AiMouseSdk.xcscheme_^#shared#^_</key>
                <dict>
index 5f5dc6f..2a2a60f 100644 (file)
         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{
index 9bb06cf..f97cdef 100644 (file)
@@ -76,6 +76,7 @@ typedef NS_ENUM(NSInteger,AiMouseConnectType) {
 @property (nonatomic, weak) id<AiMouseDelegate> delegate;/// 代理
 @property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型
 @property (nonatomic, assign) BOOL connected;//是否已连接
+@property (nonatomic, assign) BOOL tlw2;//是否是泰凌微2代
 
 /// 单利
 +(AiMouse *)shared;
index bd3f24f..dc147c6 100644 (file)
@@ -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) {
     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
 
index a6a1543..8d72da0 100644 (file)
@@ -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];
index b681e10..34fccd2 100644 (file)
@@ -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;
 }
 
 - (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
diff --git a/MouseSdk/AiMouseSdk/M8/ima_adpcm_dec.c b/MouseSdk/AiMouseSdk/M8/ima_adpcm_dec.c
new file mode 100644 (file)
index 0000000..35105e5
--- /dev/null
@@ -0,0 +1,160 @@
+#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
diff --git a/MouseSdk/AiMouseSdk/M8/ima_decode_api.h b/MouseSdk/AiMouseSdk/M8/ima_decode_api.h
new file mode 100644 (file)
index 0000000..092a078
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once\r
+\r
+int  audio_sw_decoder_pcm(unsigned char indata[], int len, unsigned short outdata[]);\r
+\r
+\r
index 933b4e9..fd44b4a 100644 (file)
                 [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];
             }
index 398d31f..75ddbcd 100644 (file)
@@ -116,7 +116,7 @@ NS_ASSUME_NONNULL_BEGIN
 /// - finished: 执行结果回调
 - (void)closeRecord:(void (^)(BOOL isSuccess,NSError *error))finished;
 
-
+- (void)startConnect;
 @end
 
 NS_ASSUME_NONNULL_END
index 4d6c738..78202c0 100644 (file)
     };
 }
 
+- (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];
index 96cec0e..0a09a9a 100644 (file)
@@ -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];
index 556807b..bfe9912 100644 (file)
@@ -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{
index bc0b41f..194ce2d 100644 (file)
Binary files a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate and b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate differ
index e220d4b..910b871 100644 (file)
@@ -7,33 +7,17 @@
       <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>
index d4282c0..09545af 100644 (file)
     [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"];
index 30f1cdd..a1cc8f6 100644 (file)
@@ -12,7 +12,7 @@
                <key>Pods-MouseSdk.xcscheme_^#shared#^_</key>
                <dict>
                        <key>orderHint</key>
-                       <integer>4</integer>
+                       <integer>2</integer>
                </dict>
        </dict>
 </dict>