Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
db10a6ee
Commit
db10a6ee
authored
Dec 09, 2015
by
Jason Simmons
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update SoundEffectPlayer to use the SoundPool API
parent
640c609f
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
88 additions
and
107 deletions
+88
-107
pubspec.yaml
packages/flutter/pubspec.yaml
+2
-2
sound.dart
packages/flutter_sprites/lib/src/sound.dart
+86
-105
No files found.
packages/flutter/pubspec.yaml
View file @
db10a6ee
...
...
@@ -7,8 +7,8 @@ dependencies:
collection
:
'
>=1.1.3
<2.0.0'
intl
:
'
>=0.12.4+2
<0.13.0'
material_design_icons
:
'
>=0.0.3
<0.1.0'
sky_engine
:
0.0.7
1
sky_services
:
0.0.7
1
sky_engine
:
0.0.7
2
sky_services
:
0.0.7
2
vector_math
:
'
>=1.4.3
<2.0.0'
# To pin the transitive dependency through mojo_sdk.
...
...
packages/flutter_sprites/lib/src/sound.dart
View file @
db10a6ee
part of
flutter_sprites
;
// TODO: The sound effects should probably use Android's SoundPool instead of
// MediaPlayer as it is more efficient and flexible for playing back sound effects
typedef
void
SoundEffectStreamCallback
(
SoundEffectStream
stream
);
/// An audio asset loaded by the SoundEffectPlayer.
class
SoundEffect
{
SoundEffect
(
this
.
_
pipeFuture
);
SoundEffect
(
this
.
_
soundId
);
// TODO: Remove load method from SoundEffect
Future
load
()
async
{
_data
=
await
_pipeFuture
;
}
Future
<
MojoDataPipeConsumer
>
_pipeFuture
;
MojoDataPipeConsumer
_data
;
int
_soundId
;
}
/// A sound being played by the SoundEffectPlayer.
class
SoundEffectStream
{
SoundEffectStream
(
this
.
sound
,
this
.
loop
,
this
.
volume
,
this
.
pitch
,
this
.
pan
,
this
.
onSoundComplete
);
// TODO: Make these properties work
SoundEffect
sound
;
bool
playing
=
false
;
bool
loop
=
false
;
double
volume
=
1.0
;
double
pitch
=
1.0
;
double
pan
=
0.0
;
// TODO: Implement completion callback. On completion, sounds should
// also be removed from the list of playing sounds.
SoundEffectStreamCallback
onSoundComplete
;
MediaPlayerProxy
_player
;
}
SoundEffectPlayer
_sharedSoundEffectPlayer
;
class
SoundEffectPlayer
{
static
SoundEffectPlayer
sharedInstance
()
{
if
(
_sharedSoundEffectPlayer
==
null
)
{
_sharedSoundEffectPlayer
=
new
SoundEffectPlayer
();
SoundEffectStream
(
SoundEffectPlayer
player
,
int
streamId
,
{
double
leftVolume
,
double
rightVolume
,
double
pitch
})
{
_player
=
player
;
_streamId
=
streamId
;
_paused
=
false
;
_leftVolume
=
leftVolume
;
_rightVolume
=
rightVolume
;
_pitch
=
pitch
;
}
SoundEffectPlayer
_player
;
int
_streamId
;
SoundPoolProxy
get
_soundPool
=>
_player
.
_soundPool
;
void
stop
()
{
_soundPool
.
ptr
.
stop
(
_streamId
);
}
bool
get
paused
=>
_paused
;
bool
_paused
;
void
set
paused
(
bool
value
)
{
_paused
=
value
;
if
(
_paused
)
{
_soundPool
.
ptr
.
pause
(
_streamId
);
}
else
{
_soundPool
.
ptr
.
resume
(
_streamId
);
}
return
_sharedSoundEffectPlayer
;
}
SoundEffectPlayer
()
{
_mediaService
=
new
MediaServiceProxy
.
unbound
();
shell
.
connectToService
(
null
,
_mediaService
);
double
get
leftVolume
=>
_leftVolume
;
double
_leftVolume
;
void
set
leftVolume
(
double
value
)
{
_leftVolume
=
value
;
_soundPool
.
ptr
.
setVolume
(
_streamId
,
<
double
>[
_leftVolume
,
_rightVolume
]);
}
MediaServiceProxy
_mediaService
;
List
<
SoundEffectStream
>
_soundEffectStreams
=
<
SoundEffectStream
>[];
// TODO: This should no longer be needed when moving to SoundPool backing
Map
<
SoundEffect
,
MediaPlayerProxy
>
_mediaPlayers
=
<
SoundEffect
,
MediaPlayerProxy
>{};
Future
_prepare
(
SoundEffectStream
playingSound
)
async
{
await
playingSound
.
_player
.
ptr
.
prepare
(
playingSound
.
sound
.
_data
);
double
get
rightVolume
=>
_rightVolume
;
double
_rightVolume
;
void
set
rightVolume
(
double
value
)
{
_rightVolume
=
value
;
_soundPool
.
ptr
.
setVolume
(
_streamId
,
<
double
>[
_leftVolume
,
_rightVolume
]);
}
// TODO: Move sound loading here
// TODO: Support loading sounds from bundles
// Future<SoundEffect> load(url) async {
// ...
// }
// TODO: Add sound unloader
// unload(SoundEffect effect) {
// ...
// }
// TODO: Add paused property (should pause playback of all sounds)
bool
paused
;
double
get
pitch
=>
_pitch
;
double
_pitch
;
void
set
pitch
(
double
value
)
{
_pitch
=
value
;
_soundPool
.
ptr
.
setRate
(
_streamId
,
_pitch
);
}
}
SoundEffectStream
play
(
SoundEffect
sound
,
[
bool
loop
=
false
,
double
volume
=
1.0
,
double
pitch
=
1.0
,
double
pan
=
0.0
,
SoundEffectStreamCallback
callback
=
null
])
{
// Create new PlayingSound object
SoundEffectStream
playingSound
=
new
SoundEffectStream
(
sound
,
loop
,
volume
,
pitch
,
pan
,
callback
class
SoundEffectPlayer
{
SoundEffectPlayer
(
int
maxStreams
)
{
MediaServiceProxy
mediaService
=
new
MediaServiceProxy
.
unbound
();
shell
.
connectToService
(
null
,
mediaService
);
_soundPool
=
new
SoundPoolProxy
.
unbound
();
mediaService
.
ptr
.
createSoundPool
(
_soundPool
,
maxStreams
);
}
SoundPoolProxy
_soundPool
;
bool
_paused
;
int
_nextStreamId
=
0
;
Future
<
SoundEffect
>
load
(
MojoDataPipeConsumer
data
)
async
{
SoundPoolLoadResponseParams
result
=
await
_soundPool
.
ptr
.
load
(
data
);
if
(
result
.
success
)
return
new
SoundEffect
(
result
.
soundId
);
throw
new
Exception
(
'Unable to load sound'
);
}
Future
<
SoundEffectStream
>
play
(
SoundEffect
sound
,
{
double
leftVolume:
1.0
,
double
rightVolume:
1.0
,
bool
loop:
false
,
double
pitch:
1.0
})
async
{
int
streamId
=
_nextStreamId
++;
SoundPoolPlayResponseParams
result
=
await
_soundPool
.
ptr
.
play
(
sound
.
_soundId
,
streamId
,
<
double
>[
leftVolume
,
rightVolume
],
loop
,
pitch
);
// TODO: Replace this with calls to SoundPool
if
(
_mediaPlayers
[
sound
]
==
null
)
{
// Create player
playingSound
.
_player
=
new
MediaPlayerProxy
.
unbound
();
_mediaService
.
ptr
.
createPlayer
(
playingSound
.
_player
);
// Prepare sound, then play it
_prepare
(
playingSound
).
then
((
_
)
{
playingSound
.
_player
.
ptr
.
seekTo
(
0
);
playingSound
.
_player
.
ptr
.
start
();
});
_soundEffectStreams
.
add
(
playingSound
);
_mediaPlayers
[
sound
]
=
playingSound
.
_player
;
}
else
{
// Reuse player
playingSound
.
_player
=
_mediaPlayers
[
sound
];
playingSound
.
_player
.
ptr
.
seekTo
(
0
);
playingSound
.
_player
.
ptr
.
start
();
if
(
result
.
success
)
{
return
new
SoundEffectStream
(
this
,
streamId
,
leftVolume:
leftVolume
,
rightVolume:
rightVolume
,
pitch:
pitch
);
}
return
playingSound
;
throw
new
Exception
(
'Unable to play sound'
)
;
}
void
stop
(
SoundEffectStream
stream
)
{
stream
.
_player
.
ptr
.
pause
();
_soundEffectStreams
.
remove
(
stream
);
}
bool
get
paused
=>
_paused
;
void
stopAll
()
{
for
(
SoundEffectStream
playingSound
in
_soundEffectStreams
)
{
playingSound
.
_player
.
ptr
.
pause
();
void
set
paused
(
bool
value
)
{
_paused
=
value
;
if
(
_paused
)
{
_soundPool
.
ptr
.
pauseAll
();
}
else
{
_soundPool
.
ptr
.
resumeAll
();
}
_soundEffectStreams
=
<
SoundEffectStream
>[];
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment