mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
sound: Add a new stop_play() method
At present there is no positive indication that U-Boot has finished sending sound data. This means that it is not possible to power down an audio codec, for example. Add a new method that is called once all sound data has been sent. Add a new method for this, called when the sound_play() call is done. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
3ff6fe5fab
commit
3062cd17af
5 changed files with 51 additions and 1 deletions
|
@ -165,6 +165,13 @@ int sandbox_get_i2s_sum(struct udevice *dev);
|
|||
*/
|
||||
int sandbox_get_setup_called(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* sandbox_get_sound_active() - Returns whether sound play is in progress
|
||||
*
|
||||
* @return true if active, false if not
|
||||
*/
|
||||
int sandbox_get_sound_active(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* sandbox_get_sound_sum() - Read back the sum of the sound data so far
|
||||
*
|
||||
|
|
|
@ -26,7 +26,8 @@ struct sandbox_i2s_priv {
|
|||
};
|
||||
|
||||
struct sandbox_sound_priv {
|
||||
int setup_called;
|
||||
int setup_called; /* Incremented when setup() method is called */
|
||||
bool active; /* TX data is being sent */
|
||||
int sum; /* Use to sum the provided audio data */
|
||||
bool allow_beep; /* true to allow the start_beep() interface */
|
||||
int frequency_hz; /* Beep frequency if active, else 0 */
|
||||
|
@ -59,6 +60,13 @@ int sandbox_get_setup_called(struct udevice *dev)
|
|||
return priv->setup_called;
|
||||
}
|
||||
|
||||
int sandbox_get_sound_active(struct udevice *dev)
|
||||
{
|
||||
struct sandbox_sound_priv *priv = dev_get_priv(dev);
|
||||
|
||||
return priv->active;
|
||||
}
|
||||
|
||||
int sandbox_get_sound_sum(struct udevice *dev)
|
||||
{
|
||||
struct sandbox_sound_priv *priv = dev_get_priv(dev);
|
||||
|
@ -163,6 +171,16 @@ static int sandbox_sound_play(struct udevice *dev, void *data, uint data_size)
|
|||
return i2s_tx_data(uc_priv->i2s, data, data_size);
|
||||
}
|
||||
|
||||
static int sandbox_sound_stop_play(struct udevice *dev)
|
||||
{
|
||||
struct sandbox_sound_priv *priv = dev_get_priv(dev);
|
||||
|
||||
sandbox_sdl_sound_stop();
|
||||
priv->active = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sandbox_sound_start_beep(struct udevice *dev, int frequency_hz)
|
||||
{
|
||||
struct sandbox_sound_priv *priv = dev_get_priv(dev);
|
||||
|
@ -228,6 +246,7 @@ U_BOOT_DRIVER(sandbox_i2s) = {
|
|||
static const struct sound_ops sandbox_sound_ops = {
|
||||
.setup = sandbox_sound_setup,
|
||||
.play = sandbox_sound_play,
|
||||
.stop_play = sandbox_sound_stop_play,
|
||||
.start_beep = sandbox_sound_start_beep,
|
||||
.stop_beep = sandbox_sound_stop_beep,
|
||||
};
|
||||
|
|
|
@ -31,6 +31,16 @@ int sound_play(struct udevice *dev, void *data, uint data_size)
|
|||
return ops->play(dev, data, data_size);
|
||||
}
|
||||
|
||||
int sound_stop_play(struct udevice *dev)
|
||||
{
|
||||
struct sound_ops *ops = sound_get_ops(dev);
|
||||
|
||||
if (!ops->play)
|
||||
return -ENOSYS;
|
||||
|
||||
return ops->stop_play(dev);
|
||||
}
|
||||
|
||||
int sound_start_beep(struct udevice *dev, int frequency_hz)
|
||||
{
|
||||
struct sound_ops *ops = sound_get_ops(dev);
|
||||
|
@ -97,6 +107,7 @@ int sound_beep(struct udevice *dev, int msecs, int frequency_hz)
|
|||
|
||||
ret = sound_play(dev, data, size);
|
||||
}
|
||||
sound_stop_play(dev);
|
||||
|
||||
free(data);
|
||||
|
||||
|
|
|
@ -68,6 +68,18 @@ struct sound_ops {
|
|||
*/
|
||||
int (*play)(struct udevice *dev, void *data, uint data_size);
|
||||
|
||||
/**
|
||||
* stop_play() - Indicate that there is no more data coming
|
||||
*
|
||||
* This is called once play() has finished sending all the data to the
|
||||
* output device. This may be used to tell the hardware to turn off the
|
||||
* codec, for example.
|
||||
*
|
||||
* @dev: Sound device
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*stop_play)(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* start_beep() - Start beeping (optional)
|
||||
*
|
||||
|
|
|
@ -28,6 +28,7 @@ static int dm_test_sound(struct unit_test_state *uts)
|
|||
ut_asserteq(4560, sandbox_get_sound_sum(dev));
|
||||
ut_assertok(sound_beep(dev, 1, 100));
|
||||
ut_asserteq(9120, sandbox_get_sound_sum(dev));
|
||||
ut_asserteq(false, sandbox_get_sound_active(dev));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue