Радио

Версия Minecraft
1.7.10

will0376

Токсичная личность
2,079
55
585
Никак не могу допереть, как остановить радио после включения в отдельном потоке(библиотека JLayer)...
Java:
    public static String URL = "";
    public static boolean stop = false;
    public static boolean enableplay = false;
    private Player player;
   
    public void run()
    {
       
        FMLLog.getLogger().info(main.Radio + " URL: " + this.URL);

        try {
           
            URL url1 = new URL(this.URL);
            InputStream fin = url1.openStream();
            InputStream is = new BufferedInputStream(fin);
           
           // Player player;
            player = new Player(is);
            FMLLog.getLogger().info(main.Radio + " URL: " + this.URL);
            if (stop) //(но ничего не делает. )
            {
               
                FMLLog.getLogger().info(main.Radio + " killed!");
            player.close();
                return ;
            }
            player.play();

        }
        catch (FileNotFoundException e)
        {
            FMLLog.getLogger().info("Url %s не найден:", this.URL);
        }
        catch (Exception e)
        {
            FMLLog.getLogger().info("При проигрывании с потока %s возникла следующая ошибка:", this.URL);
            FMLLog.getLogger().info(e.toString());
        }
       
    }
что поделать? гугл излазил, не помоло.
 
3,005
192
592
В Forge нету класса Player.
А код для баккита..
А у нас на Forge форум. .
 

will0376

Токсичная личность
2,079
55
585
А у тебя, даже если stop всегда true ог работает?
да, т.к. поток на проигрывании аудио-потока(радио же, карл) "зависает"(сложно сказать зависает...) и дальше не идет. мб как-то исключение вызвать?(если надо - могу весь класс скинуть, но там без тазика под кровь из глаз не глянуть... ибо просто туча переменных,которые так или иначе связанны с костылями или тупо не используются...)

upd.
Java:
package ru.will0376.api.gui;

import org.lwjgl.input.Keyboard;

import cpw.mods.fml.common.FMLLog;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSelectWorld;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.resources.I18n;
import ru.will0376.api.main;
import javazoom.jl.player.*;
import java.io.*;
import java.util.*;
import java.net.URL;

public class radiogui extends GuiScreen {  // Пример брал с гуи добавления сервера в мультиплеер.
   
    private final GuiScreen prgs;
    private Boolean prpl;
    private GuiTextField test;
    private GuiTextField url;
    static radioplay rplay;

    public radiogui(custGuiMainMenu gs, GuiScreen gs2) {
        if (gs == null)
        this.prgs = gs;
       
        else
        this.prgs = gs2; //Просто ппц какой костыль.(но работает...лол)
    }

    public void updateScreen()
    {
        this.url.updateCursorCounter();
    }
    public void initGui()
    {
        Keyboard.enableRepeatEvents(true);
        this.buttonList.clear();
       this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 18, I18n.format("radio.play", new Object[0])));
        this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + 18, I18n.format("radio.back", new Object[0])));
        this.buttonList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 72, I18n.format("radio.stop", new Object[0])));
      /*  this.test = new GuiTextField(this.fontRendererObj, this.width / 2 - 100, 66, 200, 20);
        this.test.setFocused(true);
        //this.test.setText(this.prsd.serverName);*/
        this.url = new GuiTextField(this.fontRendererObj, this.width / 2 - 100, 106, 200, 20);
        this.url.setMaxStringLength(128);
        this.url.setText(radioplay.URL);
        if (!rplay.enableplay) {
            //((GuiButton)this.buttonList.get(2)).enabled = false; //на время тестов.
        }
        if (rplay.enableplay) {
            ((GuiButton)this.buttonList.get(0)).enabled = false;
        }
      //  ((GuiButton)this.buttonList.get(0)).enabled = this.field_146308_f.getText().length() > 0 && this.field_146308_f.getText().split(":").length > 0 && this.field_146309_g.getText().length() > 0;
            //Пример
    }
    public void onGuiClosed()
    {
        Keyboard.enableRepeatEvents(false);
    }
public boolean enable;
    protected void actionPerformed(GuiButton p_146284_1_)
    {
       
        rplay = new radioplay();
        Thread th = new Thread(rplay);
        th.setName("radio");
        boolean alive = th.isAlive();
       
        if (p_146284_1_.enabled)
        {
            if (p_146284_1_.id == 2)
            {
                rplay.enableplay = false;
               
                //th.stop(); //Этот код не рекомендуется к использованию в яве(да и не работает.)
                rplay.stop = false;
                this.mc.displayGuiScreen(this);
           
            }
            else if (p_146284_1_.id == 1)
            {
                this.mc.displayGuiScreen(this.prgs);
                //this.prgs.confirmClicked(false, 0); // не сработало... хотя хз, работает через костыль и норм.
            }
            else if (p_146284_1_.id == 0)
            {

               
                //th.setDaemon(true);          
                rplay.enableplay = true;
                if (alive) {
                    //th.stop();
                    rplay.stop = false;
                }
                th.start();
               
               
                rplay.URL = "";
                rplay.URL = this.url.getText();
               // this.prgs.confirmClicked(true, 0);
                this.mc.displayGuiScreen(this);
            }
        }
    }
   
    protected void keyTyped(char p_73869_1_, int p_73869_2_)
    {
        this.url.textboxKeyTyped(p_73869_1_, p_73869_2_);

        if (p_73869_2_ == 15)
        {
            this.url.setFocused(!this.url.isFocused());
        }

        if (p_73869_2_ == 28 || p_73869_2_ == 156)
        {
            this.actionPerformed((GuiButton)this.buttonList.get(0));
        }

       // ((GuiButton)this.buttonList.get(0)).enabled = this.url.getText().length() > 0 && this.url.getText().split(":").length > 0 && this.url.getText().length() > 0;
    }
    protected void mouseClicked(int p_73864_1_, int p_73864_2_, int p_73864_3_)
    {
        super.mouseClicked(p_73864_1_, p_73864_2_, p_73864_3_);
        this.url.mouseClicked(p_73864_1_, p_73864_2_, p_73864_3_);
    }
   
    public void drawScreen(int p_73863_1_, int p_73863_2_, float p_73863_3_)
    {
        this.drawWorldBackground(40);
      //  this.drawCenteredString(this.fontRendererObj, I18n.format("addServer.title", new Object[0]), this.width / 2, 17, 16777215);
       // this.drawString(this.fontRendererObj, I18n.format("addServer.enterName", new Object[0]), this.width / 2 - 100, 53, 10526880);
        this.drawString(this.fontRendererObj, I18n.format("radio.Url", new Object[0]), this.width / 2 - 100, 94, 10526880);
       // this.test.drawTextBox();
        this.url.drawTextBox();
        super.drawScreen(p_73863_1_, p_73863_2_, p_73863_3_);
    }
}

class radioplay implements Runnable
{
    public static String URL = "";
    public static boolean stop = false;
    public static boolean enableplay = false;
    private Player player;
   
    public void run()
    {
       
        FMLLog.getLogger().info(main.Radio + " URL: " + this.URL);

        try {
           
            URL url1 = new URL(this.URL);
            InputStream fin = url1.openStream();
            InputStream is = new BufferedInputStream(fin);
           
            player = new Player(is);
            FMLLog.getLogger().info(main.Radio + " URL: " + this.URL);
            if (stop) //убить поток. не работает.
            {
               
                FMLLog.getLogger().info(main.Radio + " killed!");
            player.close();
                return ;
            }
            player.play();

        }
        catch (FileNotFoundException e)
        {
            FMLLog.getLogger().info("Url %s не найден:", this.URL);
        }
        catch (Exception e)
        {
            FMLLog.getLogger().info("При проигрывании с потока %s возникла следующая ошибка:", this.URL);
            FMLLog.getLogger().info(e.toString());
        }
       
    }
}
 
Последнее редактирование:
154
17
97
Ну, возможно создавать новый поток при каждом нажатии на кнопку это такая себе идея. Лучше вынести в определенное место, чтобы он всегда был один, и чтобы взаимодействовать с ним можно было через статики.
А не работает возможно потому, что ты как раз при любом нажатии на кнопку создаешь новый runnable и thread, и те действия, которые ты с ними производишь, делаются каждый раз с новыми объектами.
Подробнее, когда ты нажимаешь кнопку запуска, создается поток и запускается. Когда ты кликаешь на кнопку остановки, создается совсем другая runnable и thread, который даже не запущен, и ты говоришь ему stop = true.
 

will0376

Токсичная личность
2,079
55
585
Ну, возможно создавать новый поток при каждом нажатии на кнопку это такая себе идея.
Возможно. Я сейчас не могу трезво судить, отосплюсь - попробую сделать по-другому... но все-равно после включения воспроизведения - даже if не "отзывался"...
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,456
598
2,893
Вынеси поток в переменную. По нажатию проверяй, если поток не нулл и плеер в потоке играет - убиваем поток(incurrupt) и приравниваем к нулл. Иначе же создаёшь новый объект потока и стартуешь его.
 

will0376

Токсичная личность
2,079
55
585
Последнее редактирование:

will0376

Токсичная личность
2,079
55
585
Получилось сделать остановку аудио-потока, но работает это только один раз(при этом в дебаге выскакивает1520704526556.png), при следующем запуске крашит ссылаясь на IllegalThreadStateException. Я, кажется, запутался окончательно.
Java:
package ru.will0376.api.gui;

import org.lwjgl.input.Keyboard;

import cpw.mods.fml.common.FMLLog;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSelectWorld;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.resources.I18n;
import ru.will0376.api.main;
import javazoom.jl.player.*;
import java.io.*;
import java.util.*;
import java.net.URL;

public class radiogui extends GuiScreen {  // Пример брал с гуи добавления сервера в мультиплеер.
   
    private final GuiScreen prgs;
    private Boolean prpl;
    private GuiTextField test;
    private GuiTextField url;
    static radioplay rplay = new radioplay();
    private boolean alive = false;
    public Thread th =  new Thread(rplay);
   

    public radiogui(custGuiMainMenu gs, GuiScreen gs2) {
        if (gs == null)
        this.prgs = gs;
       
        else
        this.prgs = gs2; //Просто ппц какой костыль.(но работает...лол)
        //this.th ;
       
    }
   

    public void updateScreen()
    {
        this.url.updateCursorCounter();
    }
   
    public void initth() {
        th.setName("radio");
        th.setDaemon(true);  
         th.start();
      rplay.init = true;
      FMLLog.getLogger().info(main.Radio + " initTh. " + alive);
    }
   
    public void initGui()
    {
        Keyboard.enableRepeatEvents(true);
        this.buttonList.clear();
       this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 18, I18n.format("radio.play", new Object[0])));
        this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + 18, I18n.format("radio.back", new Object[0])));
        this.buttonList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 72, I18n.format("radio.stop", new Object[0])));
        this.buttonList.add(new GuiButton(2, this.width / 2 - 50, this.height / 4 + 0, I18n.format("test.button", new Object[0])));
      /*  this.test = new GuiTextField(this.fontRendererObj, this.width / 2 - 100, 66, 200, 20);
        this.test.setFocused(true);
        //this.test.setText(this.prsd.serverName);*/
        this.url = new GuiTextField(this.fontRendererObj, this.width / 2 - 100, 106, 200, 20);
        this.url.setMaxStringLength(128);
        this.url.setText(radioplay.URL);
        if (!rplay.enableplay) {
            //((GuiButton)this.buttonList.get(2)).enabled = false; //на время тестов.
        }
        if (rplay.enableplay) {
            ((GuiButton)this.buttonList.get(0)).enabled = false;
        }
      //  ((GuiButton)this.buttonList.get(0)).enabled = this.field_146308_f.getText().length() > 0 && this.field_146308_f.getText().split(":").length > 0 && this.field_146309_g.getText().length() > 0;
            //Пример
    }
    public void onGuiClosed()
    {
        Keyboard.enableRepeatEvents(false);
    }
public boolean enable;
    protected void actionPerformed(GuiButton p_146284_1_)
    {
       

       
        if (p_146284_1_.enabled)
        {
            if (p_146284_1_.id == 2)
            {
                rplay.enableplay = false;              
                th.stop();
                rplay.stop = true;
                this.alive = false;
                this.mc.displayGuiScreen(this);
           
            }
            else if (p_146284_1_.id == 1)
            {
                this.mc.displayGuiScreen(this.prgs);
                //this.prgs.confirmClicked(false, 0); // не сработало... хотя хз, работает через костыль и норм.
            }
            else if (p_146284_1_.id == 0)
            {
                rplay.enableplay = true;
                this.alive = th.isAlive();
                if (!alive) {
                    initth();
                    }
               

   
                //rplay.URL = "http://ep256.streamr.ru";// для теста
                rplay.URL = this.url.getText();
               // this.prgs.confirmClicked(true, 0);
                this.mc.displayGuiScreen(this);
            }
            else if (p_146284_1_.id == 3) {
               
            }
        }
    }
   
    protected void keyTyped(char p_73869_1_, int p_73869_2_)
    {
        this.url.textboxKeyTyped(p_73869_1_, p_73869_2_);

        if (p_73869_2_ == 15)
        {
            this.url.setFocused(!this.url.isFocused());
        }

        if (p_73869_2_ == 28 || p_73869_2_ == 156)
        {
            this.actionPerformed((GuiButton)this.buttonList.get(0));
        }

       // ((GuiButton)this.buttonList.get(0)).enabled = this.url.getText().length() > 0 && this.url.getText().split(":").length > 0 && this.url.getText().length() > 0;
    }
    protected void mouseClicked(int p_73864_1_, int p_73864_2_, int p_73864_3_)
    {
        super.mouseClicked(p_73864_1_, p_73864_2_, p_73864_3_);
        this.url.mouseClicked(p_73864_1_, p_73864_2_, p_73864_3_);
    }
   
    public void drawScreen(int p_73863_1_, int p_73863_2_, float p_73863_3_)
    {
        this.drawWorldBackground(40);
      //  this.drawCenteredString(this.fontRendererObj, I18n.format("addServer.title", new Object[0]), this.width / 2, 17, 16777215);
       // this.drawString(this.fontRendererObj, I18n.format("addServer.enterName", new Object[0]), this.width / 2 - 100, 53, 10526880);
        this.drawString(this.fontRendererObj, I18n.format("radio.Url", new Object[0]), this.width / 2 - 100, 94, 10526880);
       // this.test.drawTextBox();
        this.url.drawTextBox();
        super.drawScreen(p_73863_1_, p_73863_2_, p_73863_3_);
    }
}

class radioplay implements Runnable
{
    public static String URL = "";
    public static boolean stop = false;
    public static boolean enableplay = false;
    public static boolean init = false;
    private Player player;
    private void running() {
    FMLLog.getLogger().info(main.Radio + init + " , " + enableplay);
    }
    public void run()
    {
       
        FMLLog.getLogger().info(main.Radio + " URL: " + this.URL);
        FMLLog.getLogger().info(main.Radio + init + " , " + enableplay);
        try {
           
            URL url1 = new URL(this.URL);
            InputStream fin = url1.openStream();
            InputStream is = new BufferedInputStream(fin);
            player = new Player(is);
           
            FMLLog.getLogger().info(main.Radio + " URL: " + this.URL);
            if (stop) //убить поток. не работает.
            {
            FMLLog.getLogger().info(main.Radio + " killed!");
            player.close();
                return ;
            }
            if(enableplay)
            player.play();
            else
            player.close();

        }
        catch (FileNotFoundException e)
        {
            FMLLog.getLogger().info("Url %s не найден:", this.URL);
        }
        catch (Exception e)
        {
            FMLLog.getLogger().info("При проигрывании с потока %s возникла следующая ошибка:", this.URL);
            FMLLog.getLogger().info(e.toString());
        }
       
    }
}
 
Последнее редактирование:
154
17
97
Ну, как минимум стартовать поток второй раз нельзя. Если он закончился, то ничего с ним уже не сделаешь.
Я думаю тебе нужно изначально, при старте игры, выделять один поток для всего радио и взаимодействия с ним.
Сложноватую задачу ты взял для такого уровня...
 

will0376

Токсичная личность
2,079
55
585
стартовать поток второй раз нельз
мм,ок,попробую просто стопить плеер и пересоздавать его с другим url, если надо
думаю тебе нужно изначально, при старте игры, выделять один поток для всего радио и взаимодействия с ним.
точно,что ж я сам то не допер... поток можно создавать при подгрузке основного класса моего мода,а дальше тупо передавать ему параметры по ходу дела.. Попробую
Сложноватую задачу ты взял для такого уровня...
Думал,за вечер справлюсь... но как видно - встрял.
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Java:
private PlayerThread playerThread;

// Старт плеера
if(playerThread != null || playerThread.player.isPlaying()){
    playerThread.close();
    playerThread = null;
}
playerThread = new PlayerThread(...);
playerThread.start();

// Стоп
if(playerThread != null || playerThread.player.isPlaying()){
    playerThread.close();
    playerThread = null;
}

// PlayerThread class
public PlayerThread extends Thread{
    
    public Player player;
    
    public PlayerThread(){
        player = new Player(...);
    }
    
    public void run(){
        player.play();
    }
    
    public void close(){
        player.stop();
        player = null;
        interrupt();
    }
}
 

will0376

Токсичная личность
2,079
55
585
Не, моих знаний не хватит, чтобы сделать это(даже с кодом от @Agravaine)... пока что откажусь от идеи. Спасибо за помощь.
Если у кого-то хватит мозгов(и желания) доделать - последний свой (рабочий/2) код я скидывал сверху
 
Последнее редактирование:
Сверху