我编写了一个用于测试目的的小型Java应用程序,它可以在ubuntu 12.04上从混音器中捕获声音.
代码工作正常,我可以从所有应用程序捕获声音,除了在Wine下运行的任何东西.
每当我启动我的程序时,在启动Wine之后,呼叫targetDataLine.read()将永远阻止
当Wine没有在后台运行时,它会0在没有输入时正确输出,或者如果有输入则读取字节数,如预期的那样.
如果我在启动Wine之前启动我的程序,那么声音驱动程序将无法在wine中使用.
我尝试过使用Alsa提供的混音器以及默认设备,结果相同.
我可以想象葡萄酒会以某种方式锁定Alsa(无论出于何种原因),但为什么一个简单的调用会TargetDataLine.read()导致Wine中的声音失败?
mixerInfo[0]在我的系统btw上是默认的,并且应用程序当然总是使用oracle的最新JRE(7)在Wine之外运行.
private void readSound ()
{
byte tempBuffer[] = new byte[10000];
int cnt = 0;
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
System.out.println("Available mixers:");
for (int p = 0; p < mixerInfo.length; p++)
System.out.println(mixerInfo[p].getName());
format = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, format);
Mixer mixer = AudioSystem.getMixer(mixerInfo[0]);
try
{
targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
targetDataLine.open(format);
}
catch(Exception e)
{
e.printStackTrace();
}
targetDataLine.start();
while (true)
{
i++;
cnt = targetDataLine.read(tempBuffer, …Run Code Online (Sandbox Code Playgroud) 我经常遇到类似的情况:我有一堆COM .DLL(没有IDL文件),我需要使用它并调用它们来访问一些外来的(非开放的,未记录的)数据格式.
Microsoft的Visual Studio平台具有非常好的功能,可以导入这些COM DLL并在我的项目中使用它们(Visual C++的#import指令,或使用Visual Basic .NET的对话框挑选和添加它们) - 这是供应商推荐的使用它们的方法.
我有兴趣找到一种在非Microsoft开发平台上使用这些DLL的方法.也就是说,在使用MinGW或Cygwin编译的C++项目中使用这些COM类,或者甚至将Wine的GCC端口编译为linux(将C++作为目标,将Win32编译为在Linux上本机运行的二进制文件).
我使用这个驱动程序取得了一些有限的成功,但是这在100%的情况下都没有成功(我不能使用某些方法返回的COM对象).
有人在类似情况下取得了成功吗?
以下简单版本控制脚本用于查找给定文件的最后版本号,增加它,使用新创建的文件(例如,编辑器)运行给定命令,然后将其保存到稳定.由于它很简单,因此不会检查任何内容,因为脚本会根据需要进行修改.例如,如果结果不稳定,则用户可以省略最后一个参数.
但是,当前功能的一个主要问题是如何实现以下内容:如果dot之后的最后一个部分有两个数字,则包括直到99; 如果只有1,那么直到9,然后移动到上一节.版本可以具有任何正整数个部分.
1.2.3.44 -> 1.2.3.45
1.2.3.9 -> 1.2.4.0
1.2.3 -> 1.2.4
9 -> 10
Run Code Online (Sandbox Code Playgroud)
剩下的问题是它不会等待标签式葡萄酒编辑器关闭文件; 目标是检测标签何时关闭.另外,您能解释一下如何最好地确保我的变量名称不会覆盖现有变量名称吗?
您还可以提供其他改进.
#!/bin/bash
#Tested on bash 4.1.5
#All arguments in order: "folder with file" "file pattern" cmd [stable name]
folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"
cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
sort -Vu | \
tail -n 1)
last_version_file=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
grep $last_version | \
tail -n 1) #tail -n …Run Code Online (Sandbox Code Playgroud) 我已经使用subprocess.check_output()了一段时间来捕获子进程的输出,但在某些情况下遇到了一些性能问题.我在RHEL6机器上运行它.
调用Python环境是linux编译的64位.我正在执行的子进程是一个shell脚本,最终通过Wine触发Windows python.exe进程(为什么这个愚蠢是另一个故事).作为shell脚本的输入,我在一小段Python代码中输入了传递给python.exe的代码.
虽然系统处于中等/重负载(CPU利用率为40%到70%),但我注意到subprocess.check_output(cmd, shell=True)在check_output命令返回之前,子进程完成执行后,使用会导致显着延迟(最多约45秒).ps -efH在此期间查看输出显示被调用的子进程sh <defunct>,直到它最终返回正常的零退出状态.
相反,使用subprocess.call(cmd, shell=True)在相同的中/重负载下运行相同的命令将导致子进程立即返回而没有延迟,所有输出都打印到STDOUT/STDERR(而不是从函数调用返回).
为什么只有在check_output()将STDOUT/STDERR输出重定向到其返回值时才有这么大的延迟,而不是call()只是将它打印回父代的STDOUT/STDERR?
在这种特殊情况下,我需要为Linux运行.complicated .NET应用程序.复杂的意思是 - 该项目开发了3年,我不想再用java或其他东西编写它,以后开发和支持.NET和Java版本.
应用程序正在生成鼠标和键盘事件(通过winapi/dll导入)并使用串行端口.我也有很少的延迟定时器 - 用于串口通信(10-20ms,我这里不需要大的精度).
其余的只是很多简单的代码,没什么特别的,没有怪异的控件,没有directx等.
我应该期待什么?这会有用吗?
如果代码的某些部分失败 - 我可以稍微更改它,在.net应用程序和linux上的迷你应用程序之间建立网络连接,我可以编写用于发送鼠标和键盘事件或RS232通信.
另外,我想问一下Wine和.NET:
如何编写应该在Linux/Wine/Mono上运行的.NET应用程序?
编辑/移动评论:
几年前我看过单声道,但它太可怕了.现在我看到它长大了,支持LINQ,线程和其他复杂的功能.此外,现在帮助看起来非常严重.我还没有接受回答,因为我看到人们仍然发布非常有用的链接.如果这个问题获得了很多+1,我将重写它,也许这将有助于其他人.
我希望这里有人在linux上有一些.NET实践经验...
希望这仍然是StackOverflow的主题.
我正在Linux机器上进行所有开发,但代码将由Linux和Windows机器运行.
我想用Linux编译代码,我有mingw-32和mingw-w64.
但我想将生成的可执行文件打包成一个漂亮的MSI安装文件.是否可以使用Linux中的实用程序或在Wine下运行来执行此操作?
谢谢!
我一直对葡萄酒感到惊讶.有时我想破解它,修复一些小东西并且通常理解它是如何工作的.所以,我下载了Wine源代码,之后我感到不堪重负.代码库是巨大的 - 与Linux内核不同 - 几乎没有关于代码的指南.
理解如此庞大的代码库的最佳实践是什么?
我认为标题是自我解释的...我正在用C++编写一个应用程序,我需要在运行时确定我是否在Wine下运行(为了避免特定的Wine bug而稍微更改行为).有程序员友好的方式还是我应该运行流程?
脚本
我有一个为Windows应用程序(用C++编写)的插件(dll).
该应用程序在Wine下的Linux上运行良好,但是,在插件中我想使用Wine中尚未提供的功能.
假设我可以在运行时检测到应用程序在Wine中运行,我可以动态加载本机Linux库(或以任何其他方式访问本机Linux API)以模拟所述功能吗?
我很好奇这是否可以在没有任何严重黑客的情况下完成.
有没有办法(以及如何)在Linux程序和运行葡萄酒的Windows程序之间共享内存?
由于可能很难理解为什么要做这样的事情,我告诉你我的情况:我有一个仅为windows编译的专有程序,但是这个程序有一个开放的C插件API.但是,我想让我的代码的一部分在本机应用程序上运行(并使用其他库和Linux的其他优点),并以快速的方式执行IPC