试图在我的Android应用程序上运行MIDI.我正在按照midisuite示例来配置我的应用程序,除了触后功能,它工作正常.每当我尝试触发触后时,我都会遇到线程异常类型
InteruptedException.我该如何防止这个线程问题?我对多线程的了解并不是最好的,否则我已经想到了这一点.我现在真正能说的是,消息发送得太快,线程还没有从睡眠呼叫中唤醒.
我用我的代码跟着github repo如下:
MidiReceiver 子类:
@TargetApi(Build.VERSION_CODES.M)
public class MidiEngine extends MidiReceiver {
public AudioActivity activity;
private MidiEventScheduler eventScheduler;
private MidiFramer midiFramer;
private MidiReceiver midiReceiver = new MyReceiver();
private Thread mThread;
private boolean go;
private int mProgram;
public MidiEngine() {
this(new AudioActivity());
}
public MidiEngine(AudioActivity activity) {
this.activity = activity;
midiReceiver = new MyReceiver();
midiFramer = new MidiFramer(midiReceiver);
}
public AudioActivity getActivity() {
return this.activity;
}
/* This will be called when MIDI data arrives. */
@Override …Run Code Online (Sandbox Code Playgroud) 我有点困惑如何在USB Audio Class 2.0中添加对多比特率/采样率的支持.与USB Audio Class 1.0(可以选择添加多种速率等)相比,USB Audio Class 2.0不提供该选项.我该怎么改变我的描述符呢?我在某处读到你使用更多备用设置,但我不知道这会有什么帮助......
这是我的音频格式描述符:
audioformat.bLength = sizeof(usb_audio_format_type_1_desc_t)
audioformat.bDescriptorType = 0x01
audioformat.bDescriptorSubtype = 0x02
audioformat.bFormatType = 0x01
audioformat.bSubSlotSize = 3
audioformat.bBitResolution = 24
Run Code Online (Sandbox Code Playgroud)
谢谢!
所以我正在制作一个播放背景音频的视频捕捉应用程序(来自Spotify或Apple Music),我遇到一个小问题,当我在播放音频时打开我的应用程序时会出现小的音频中断.
这就是我允许播放背景音频的内容(位于didFinishLaunchingWithOptions我的AppDelegate班级中:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers
error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
Run Code Online (Sandbox Code Playgroud)
停止开始中断的任何线索?谢谢!!
编辑
我还应该在设置AVAudioSession后提到我正在设置我的AVCaptureSession.我初始化它然后设置属性.
self.session.usesApplicationAudioSession = YES;
self.session.automaticallyConfiguresApplicationAudioSession = NO;
Run Code Online (Sandbox Code Playgroud) 我的Android应用程序存在问题,需要触摸跟踪事件(跟踪手指何时/何时向下移动,移动,向上等).我必须使用event.getX()和event.getY()函数来获取当前触摸的坐标.
所以从过去几个月我学到的东西:
MotionEvent.ACTION_DOWN 跟踪第一次触地MotionEvent.ACTION_POINTER_DOWN 跟踪后续触摸MotionEvent.ACTION_UP 跟踪最后的修饰MotionEvent.ACTION_POINTER_UP 跟踪上升的触摸MotionEvent.ACTION_MOVE 跟踪任何触摸动作在我的应用程序中,当我第一次触摸时,我遇到了一个重大问题.假设我有五个手指触摸我的设备(让我们称这些Touch 0,1,2,3,4).现在,当我举起Touch 0时,MotionEvent.ACTION_POINTER_UP是我得到的动作.完全可以理解; 我明白了 但是,现在这两件事情将会发生:
IllegalArgumentException告诉我指针指数超出范围event.getX()并event.getY()会给我一个不同的手指信息)我很想知道如何正确跟踪这些信息.有关如何正确跟踪信息或偏移触摸指针的任何线索?
我提供了我的代码的总体布局,但我觉得我没有做任何与众不同的事情(我确定它接近Android示例中的示例代码?):
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
int ptr_idx = event.getPointerId(event.getActionIndex());
try {
switch (action) {
case MotionEvent.ACTION_MOVE:
handleActionPointerMove(event);
break;
// Order of touch downs doesn't matter to us
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
handleActionPointerDown(event, ptr_idx);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
handleActionPointerUp(event, ptr_idx); …Run Code Online (Sandbox Code Playgroud) 我在 iOS 10 上请求麦克风许可时遇到了一个奇怪的问题。我放置了正确的 plist 属性(隐私 - 麦克风使用说明)并通过代码启用它。在我的手机上,麦克风工作/启用,我在手机的应用程序设置中看到它。但是,在朋友的手机上,麦克风会请求许可,但麦克风选项不会显示在应用程序的设置中。即使我正确设置了权限,我是否在这里遗漏了什么?为什么我的手机会在设置中显示该选项,而不是我朋友的手机?我有一部 iPhone SE,我的朋友有一部 iPhone 6s。
plist 属性:
<key>NSMicrophoneUsageDescription</key>
<string>Used to capture microphone input</string>
Run Code Online (Sandbox Code Playgroud)
请求许可的代码:
if ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio] == AVAuthorizationStatusAuthorized) {
[self configureMicrophone];
}
else {
UIAlertController *deniedAlert = [UIAlertController alertControllerWithTitle:@"Use your microphone?"
message:@"The FOO APP requires access to your microphone to work!"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"Go to Settings" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action){
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}];
[deniedAlert addAction:action];
[self presentViewController:deniedAlert animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
可能是错误的地方问这个,但我需要帮助弄清楚真正的问题是什么...
基本上,我正在编程一个微控制器来进行USB音频录制(使用USB Audio Class 2.0 /高速USB).看起来我已经非常接近"正确"了,但是当我将唧唧声录入大胆时,我得到了这个[下面是摘录]:
我想我要问的是为什么我会在记录会话中遇到这些奇怪的中断和跳跃?是因为我没有足够快地读取我的编解码器输入缓冲区,或者帧长度未正确设置?
我如何计算我从Apple的USB音频指南中获得的帧长度(使用44.1kHz采样率和16位速率):
#define AUDIO_POLL_INT 4
#define FRAME_BYTES (BIT_RATE_16 / 8)
#define NUM_CHANNELS STEREO
uint16_t frame_len = 44 (44.1kHz/1000 samples) * NUM_CHANNELS * FRAME_BYTES;
if (!(frame_pos % 9)) frame_len += (1 * NUM_CHANNELS * FRAME_BYTES)
frame_len = (frame_len / 8) * (2 << (AUDIO_POLL_INT-1));
// 10 ms frames
frame_pos = (((frame_pos + 1) / 8) * (2 << (AUDIO_POLL_INT-1))) % 10;
Run Code Online (Sandbox Code Playgroud)
这也是读取编解码器输入的过程:
1)读取编解码器输入; 将样本加载到临时缓冲区(从编解码器外设转移到内存外设)
2)存储器在传输完成时发生外设中断(缓冲区已满;已满足frame_len容量),将缓冲区样本发送到USB.然后,再次读取编解码器输入
希望这不是太混乱...让我知道,我可以添加更多信息/清理事情.谢谢!