Giter Site home page Giter Site logo

Comments (5)

ojw28 avatar ojw28 commented on May 16, 2024 1

I don't think LoadControl is the right place to be doing this. It feels like it's too deep in the player.

If you'd like to push your logic for starting playback just inside of the player, so that it works for commands via the MediaSession (and any other UI component), then you could use ForwardingPlayer. This is completely untested, but I'd imagine it would look something like:

class BtPlayer extends ForwardingPlayer {

    public BtPlayer(ExoPlayer player) {
      super(player);
      player.setHandleAudioBecomingNoisy(true);
    }

    @Override
    public void prepare() {
      if (blockPlayback()) {
        return;
      }
      super.prepare();
    }

    @Override
    public void play() {
      if (blockPlayback()) {
        return;
      }
      super.play();
    }

    @Override
    public void setPlayWhenReady(boolean playWhenReady) {
      if (playWhenReady && blockPlayback()) {
        return;
      }
      super.setPlayWhenReady(playWhenReady);
    }

    private boolean blockPlayback() {
      // Return whether playback should be blocked from starting
    }
}

You can then wrap your ExoPlayer inside an instance of this class, and pass the BtPlayer to the media session and any other UI components.

from media.

ojw28 avatar ojw28 commented on May 16, 2024

I think this should be done outside of the player. In other words, you should query whether there's a bluetooth headset connected before you prepare your ExoPlayer instance. ExoPlayer's audio-becoming-noisy handling might be sufficient for stopping the audio, but it's probably cleaner and more symmetric if you also handle this outside of the player. In other words, listen for the headset disconnecting, and stop the player when this occurs.

How to query bluetooth connected devices is outside the scope of this issue tracker, but you should be able to find what you need online. For example https://stackoverflow.com/questions/4715865/how-can-i-programmatically-tell-if-a-bluetooth-device-is-connected has some sample isBluetoothHeadsetConnected methods that might be useful to you.

from media.

yschimke avatar yschimke commented on May 16, 2024

@ojw28 Thanks. That makes sense, and I've got docs on how to check and connect to the bluetooth headset.

It's not perfect, If the app laucnhes and then bluetooth disconnects before playback is started, I'll be in the same place. I can guard any play button presses, but it doesn't help for commands via the MediaSession, so I was hoping there was a nice approach to do this in ExoPlayer/Media3. Maybe show up via affecting availableCommands? Maybe interject during the LoadControl before it continues? I understand if not, and if there is some clean way to add, I'll suggest putting up a PR.

Would there be a downside to using LoadControl?

from media.

yschimke avatar yschimke commented on May 16, 2024

Thanks I'll try that or fallback to external logic at all points before playing.

Thanks.

from media.

yschimke avatar yschimke commented on May 16, 2024

The above solution has worked reasonably well, but it looks like to avoid errors like #167.

We will need to implement google/horologist#562 and use playback suppression for this.

from media.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.