xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
阅读:21968回复:58

[版本发布]凤凰OS HDMI无声音的小伙伴们看过来啦

楼主#
更多 发布于:2018-04-17 12:10
我做了个APP,直接打开就能执行批处理命令然后就有声音啦,不过目前仅支持NVIDIA显卡接HDMI到电视机的解决,想要解决其他的,麻烦回帖跟我讲步骤哦。
链接:https://pan.baidu.com/s/1872_sWi6RumlMsfzRMCP-w 密码:kgnt
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
沙发#
发布于:2018-04-17 12:12
以下为源码
package com.xlzhen.phoenixosaudio;

import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MainActivity extends AppCompatActivity {
    private TextView toast_textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toast_textView = findViewById(R.id.toast_textView);
        toast_textView.setMovementMethod(ScrollingMovementMethod.getInstance());
        new AlertDialog.Builder(MainActivity.this).setMessage(R.string.start_hint)
                .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startAudioChange();
                    }
                })
                .setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                }).create().show();


    }

    private void startAudioChange() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                final boolean isRoot = RootCmd.upgradeRootPermission(getPackageCodePath());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        toast_textView.setText(getString(R.string.is_root) + (isRoot ? getString(R.string.yes) : getString(R.string.no)));

                        if (isRoot)
                            checkOpenAudio();
                    }
                });
            }
        }).run();

    }

    private void checkOpenAudio() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                final String str = new ExeCommand().run("alsa_amixer -c1 contents", 10000).getResult();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        toast_textView.setText(getString(R.string.get_contents) + str);
                        Pattern AUDIO_PATTERN = Pattern
                                .compile("numid=.*?,iface=CARD,name='HDMI/DP,pcm=(.*?)Jack'\n" +
                                        ".*?;.*?type=BOOLEAN,access=r-------,values=1\n" +
                                        ".*?:.*?values=on");

                        Matcher mbanner = AUDIO_PATTERN.matcher(str);
                        String value = "";
                        while (mbanner.find()) {
                            value = mbanner.group(1);
                        }

                        toast_textView.setText(getString(R.string.get_audio_switch_is_on) + value);

                        checkPCM(value);
                    }
                });
            }
        }).run();



    }

    private void checkPCM(final String value) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                final List<String> changeFileNameList = new ArrayList<>();
                String str = new ExeCommand().run("ls /dev/snd/", 10000).getResult();
                final String[] fileList = str.split("\n");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        for (String file : fileList) {
                            if (file.contains("D" + value.trim() + "p"))
                                toast_textView.setText(toast_textView.getText().toString() + "\n" + getString(R.string.no_modify_file_name) + file);
                            else if (file.contains("pcmC") && !file.contains("D" + value + "p")) {
                                changeFileNameList.add(file);
                                toast_textView.setText(toast_textView.getText().toString() + "\n" + getString(R.string.modify_file_name) + file);
                            }
                        }

                        writeInitShFile(changeFileNameList);
                    }
                });
            }
        }).run();



    }

    private void writeInitShFile(List<String> changeFileNameList) {
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 4; i++)
            value.append("\t\t\talsa_amixer -c1 set 'IEC958',").append(i).append(" on\n");

        for (String changeFileName : changeFileNameList)
            value.append("\t\t\tmv /dev/snd/").append(changeFileName).append(" /dev/snd/1").append(changeFileName).append("\n");

        value.append("\t\t\tkillall audioserver\n");

        toast_textView.setText(getString(R.string.need_write_init_sh) + value);
        readInitShFile(value.toString());
    }

    private void readInitShFile(final String value) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                final StringBuilder str = new StringBuilder(new ExeCommand().run("cat etc/init.sh", 10000).getResult());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        toast_textView.setText(getString(R.string.init_sh_file_content) + str.toString());

                        List<String> strings = Arrays.asList(str.toString().split("\n"));
                        List<String> restores = new ArrayList<>();
                        for (int i = 0; i < strings.size(); i++) {
                            restores.add(strings.get(i) + "\n");
                            if (strings.get(i).contains("Internal Mic Boost"))
                                restores.add(value);
                        }
                        StringBuilder result = new StringBuilder();
                        for (int i = 0; i < restores.size(); i++)
                            result.append(restores.get(i));

                        toast_textView.setText(getString(R.string.init_sh_file_add_content) + result.toString());
                        initResult = result.toString();
                        backupInitSh();
                    }
                });
            }
        }).run();
    }

    private void backupInitSh() {
        new Thread(new Runnable() {
            @Override
            public void run() {

                new ExeCommand().run("mv /etc/init.sh /etc/init.sh.bak", 10000).getResult();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        myPermission();
                    }
                });
            }
        }).run();



    }

    private String initResult;

    private static final int REQUEST_EXTERNAL_STORAGE = 1;

    public void myPermission() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_EXTERNAL_STORAGE);
        } else {
            saveInitSh();
        }
    }

    private void saveInitSh() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                StringUtils.saveStringToTxt(initResult, "init.sh");
                new ExeCommand().run("mv " + StringUtils.SDCardPath + "init.sh /etc/init.sh", 10000).getResult();
                new ExeCommand().run("chmod 777 /etc/init.sh", 10000).getResult();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        new AlertDialog.Builder(MainActivity.this).setMessage(R.string.success_hint)
                                .setPositiveButton(getString(R.string.ok_a), new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        new ExeCommand().run("reboot", 10000).getResult();
                                    }
                                })
                                .setNegativeButton(getString(R.string.wait_me_reboot), new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        finish();
                                    }
                                }).create().show();
                    }
                });
            }
        }).run();


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

        if (requestCode == REQUEST_EXTERNAL_STORAGE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                saveInitSh();
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, R.string.per_den, Toast.LENGTH_SHORT).show();
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    public void reductionInit(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                new ExeCommand().run("rm -f /etc/init.sh", 10000).getResult();
                new ExeCommand().run("mv /etc/init.sh.bak /etc/init.sh", 10000).getResult();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                new AlertDialog.Builder(MainActivity.this).setMessage(R.string.reduction_success_hint)
                                        .setPositiveButton(getString(R.string.ok_a), new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                new ExeCommand().run("reboot", 10000).getResult();
                                            }
                                        })
                                        .setNegativeButton(getString(R.string.wait_me_reboot), new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                finish();
                                            }
                                        }).create().show();
                            }
                        });
                    }
                });
            }
        }).run();

    }
}
shuangdaommm
金丹期 · 高手
金丹期 · 高手
  • UID47572
  • 注册日期2018-03-19
  • 粉丝2
  • 发帖数32
  • 威望488
  • 被喜欢31
  • 有效bug0
板凳#
发布于:2018-04-17 15:36
很好用。但是我的麦克风又无声了。我的电脑主板是华硕b85主板,gtx750独立显卡,hdmi连接电视hdmi3接口。以前是耳麦接机箱后插口,耳机有声音,话筒不好用。后来在论坛看到帖子,每次开机执行命令sh sdcard/1.txt话筒才好用。
shuangdaommm
金丹期 · 高手
金丹期 · 高手
  • UID47572
  • 注册日期2018-03-19
  • 粉丝2
  • 发帖数32
  • 威望488
  • 被喜欢31
  • 有效bug0
地板#
发布于:2018-04-17 15:38
1.txt文本内容如下:

alsa_amixer -c0 set 'Front Mic' on
alsa_amixer -c0 set 'Front Mic' 100
alsa_amixer -c0 set 'Front Mic Boost' 1
alsa_amixer -c0 set 'Rear Mic' on
alsa_amixer -c0 set 'Rear Mic' 100%
alsa_amixer -c0 set 'Rear Mic Boost' 1
alsa_amixer -c0 set 'Line' on
alsa_amixer -c0 set 'Line' 100%
alsa_amixer -c0 set 'Line Boost' 1
alsa_amixer -c0 set 'Input Source',0 'Rear Mic'
shuangdaommm
金丹期 · 高手
金丹期 · 高手
  • UID47572
  • 注册日期2018-03-19
  • 粉丝2
  • 发帖数32
  • 威望488
  • 被喜欢31
  • 有效bug0
4楼#
发布于:2018-04-17 15:39
求楼主给解决办法,让话筒好用,hdmi有声音输出,二者不冲突
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
5楼#
发布于:2018-04-17 15:42
shuangdaommm:1.txt文本内容如下:

alsa_amixer -c0 set 'Front Mic' on
alsa_amixer -c0 set 'Front Mic' 100
alsa_amixer -c0 set 'Front Mic ...
回到原帖
好,我有空看看。
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
6楼#
发布于:2018-04-17 15:42
shuangdaommm:1.txt文本内容如下:

alsa_amixer -c0 set 'Front Mic' on
alsa_amixer -c0 set 'Front Mic' 100
alsa_amixer -c0 set 'Front Mic ...
回到原帖
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
7楼#
发布于:2018-04-17 15:49
shuangdaommm:求楼主给解决办法,让话筒好用,hdmi有声音输出,二者不冲突回到原帖
我帮你把这段代码弄到app里面打包好,这样你就可以全部兼容了
youling257
真仙
真仙
  • UID304
  • 注册日期2015-08-01
  • 粉丝455
  • 发帖数5919
  • 威望31922
  • 被喜欢2286
  • 有效bug0
8楼#
发布于:2018-04-17 15:51
xlzhen1:我帮你把这段代码弄到app里面打包好,这样你就可以全部兼容了回到原帖
你那批处理把pcmC0D0c重命名成了1pcmC0D0c了吧,pcmC0D0c是用来录音的
shuangdaommm
金丹期 · 高手
金丹期 · 高手
  • UID47572
  • 注册日期2018-03-19
  • 粉丝2
  • 发帖数32
  • 威望488
  • 被喜欢31
  • 有效bug0
9楼#
发布于:2018-04-17 15:56
谢谢了。你重新发布一个app?
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
10楼#
发布于:2018-04-17 16:04
youling257:你那批处理把pcmC0D0c重命名成了1pcmC0D0c了吧,pcmC0D0c是用来录音的回到原帖
嗯?那我把它重命名去掉吧
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
11楼#
发布于:2018-04-17 16:35
youling257:你那批处理把pcmC0D0c重命名成了1pcmC0D0c了吧,pcmC0D0c是用来录音的回到原帖
去除了c结尾的文件重命名,链接:https://pan.baidu.com/s/1OJJ5DVZKDJyYSBYIeC4SeA 密码:22p6
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
12楼#
发布于:2018-04-17 16:36
shuangdaommm:谢谢了。你重新发布一个app?回到原帖
兼容了你的麦克风问题,链接:https://pan.baidu.com/s/1OJJ5DVZKDJyYSBYIeC4SeA 密码:22p6
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
13楼#
发布于:2018-04-17 16:37
源码奉上,只上传改动了代码的部分。
  private void checkPCM(final String value) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                final List<String> changeFileNameList = new ArrayList<>();
                String str = new ExeCommand().run("ls /dev/snd/", 10000).getResult();
                final String[] fileList = str.split("\n");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        for (String file : fileList) {
                            if (file.contains("D" + value.trim() + "p"))
                                toast_textView.setText(toast_textView.getText().toString() + "\n" + getString(R.string.no_modify_file_name) + file);
                            else if (file.contains("pcmC") && !file.contains("D" + value + "p")&&file.charAt(file.length()-1)!='c') {
                                changeFileNameList.add(file);
                                toast_textView.setText(toast_textView.getText().toString() + "\n" + getString(R.string.modify_file_name) + file);
                            }
                        }

                        writeInitShFile(changeFileNameList);
                    }
                });
            }
        }).run();



    }

    private void writeInitShFile(List<String> changeFileNameList) {
        StringBuilder value = new StringBuilder();
        value.append("\t\t\talsa_amixer -c0 set 'Front Mic' on\n");
        value.append("\t\t\talsa_amixer -c0 set 'Front Mic' 100\n");
        value.append("\t\t\talsa_amixer -c0 set 'Front Mic Boost' 1\n");
        value.append("\t\t\talsa_amixer -c0 set 'Rear Mic' on\n");
        value.append("\t\t\talsa_amixer -c0 set 'Rear Mic' 100%\n");
        value.append("\t\t\talsa_amixer -c0 set 'Rear Mic Boost' 1\n");
        value.append("\t\t\talsa_amixer -c0 set 'Line' on\n");
        value.append("\t\t\talsa_amixer -c0 set 'Line' 100%\n");
        value.append("\t\t\talsa_amixer -c0 set 'Line Boost' 1\n");
        value.append("\t\t\talsa_amixer -c0 set 'Input Source',0 'Rear Mic'\n");
        for (int i = 0; i < 4; i++)
            value.append("\t\t\talsa_amixer -c1 set 'IEC958',").append(i).append(" on\n");

        for (String changeFileName : changeFileNameList)
            value.append("\t\t\tmv /dev/snd/").append(changeFileName).append(" /dev/snd/1").append(changeFileName).append("\n");

        value.append("\t\t\tkillall audioserver\n");

        toast_textView.setText(getString(R.string.need_write_init_sh) + value);
        readInitShFile(value.toString());
    }
xlzhen1
金丹期 · 高手
金丹期 · 高手
  • UID56069
  • 注册日期2018-04-16
  • 粉丝9
  • 发帖数24
  • 威望382
  • 被喜欢32
  • 有效bug0
14楼#
发布于:2018-04-17 16:39
还有有需要帮忙做兼容的可以找我哦,就是HDMI无声音,然后已经解决的,把步骤发给我,我写进APP里面。以后打开APP就搞定不是挺好的嘛,对小白更友好。兼容性越好对小白越有利。
上一页
游客

返回顶部