Skip to content

Commit

Permalink
[ExoPlayer] 🎵 Demo using exo player to modif speed and pitch
Browse files Browse the repository at this point in the history
  • Loading branch information
JonathanMercandalli committed Apr 22, 2018
1 parent b3b70c4 commit b297dec
Show file tree
Hide file tree
Showing 45 changed files with 671 additions and 235 deletions.
4 changes: 3 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(":soundsystem")

implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.android.support:appcompat-v7:$support_version"
implementation "com.android.support:cardview-v7:$support_version"
implementation "com.android.support:design:$support_version"

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,17 @@ package com.mercandalli.android.apps.theremin
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.SeekBar
import android.widget.TextView
import com.mercandalli.android.sdk.soundsystem.ThereminManager

class MainActivity : AppCompatActivity() {

private lateinit var thereminManager: ThereminManager
private val thereminListener = createThereminListener()
private lateinit var distanceTextView: TextView
private lateinit var distanceSeekBar: SeekBar
private lateinit var speedTextView: TextView
private lateinit var speedSeekBar: SeekBar

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -16,7 +22,9 @@ class MainActivity : AppCompatActivity() {
Graph.init(this)
thereminManager = Graph.thereminManager

findViewById<SeekBar>(R.id.activity_main_seekbar_distance).setOnSeekBarChangeListener(
distanceTextView = findViewById(R.id.activity_main_distance_text)
distanceSeekBar = findViewById(R.id.activity_main_distance_seekbar)
distanceSeekBar.setOnSeekBarChangeListener(
object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
syncSeekbar(seekBar!!)
Expand All @@ -30,10 +38,35 @@ class MainActivity : AppCompatActivity() {
syncSeekbar(seekBar!!)
}
})
speedTextView = findViewById(R.id.activity_main_speed_text)
speedSeekBar = findViewById(R.id.activity_main_speed_seekbar)

thereminManager.registerThereminListener(thereminListener)
syncSpeedAndPitchUI()
}

private fun syncSeekbar(seekBar: SeekBar) {
val distance = seekBar.progress
thereminManager.onDistanceChanged(distance)
val distanceInt = seekBar.progress
distanceTextView.text = if (distanceInt >= 100) "Distance: >100 cm" else "Distance: $distanceInt cm"
distanceSeekBar.progress = distanceInt
thereminManager.onDistanceChanged(distanceInt)
}

private fun createThereminListener(): ThereminManager.ThereminListener {
return object : ThereminManager.ThereminListener {
override fun onPitchChanged() {
syncSpeedAndPitchUI()
}

override fun onSpeedChanged() {
syncSpeedAndPitchUI()
}
}
}

private fun syncSpeedAndPitchUI() {
val speed = (thereminManager.getSpeed() * 100f).toInt()
speedTextView.text = "Speed: $speed %"
speedSeekBar.progress = speed
}
}
119 changes: 111 additions & 8 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
@@ -1,22 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
android:layout_height="match_parent"
android:background="#1e1e1e"
android:orientation="vertical"
android:paddingTop="2dp">

<SeekBar
android:id="@+id/activity_main_seekbar_distance"
android:layout_width="match_parent"
<android.support.v7.widget.CardView
android:layout_width="280dp"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:max="100" />
android:layout_marginBottom="0dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:cardBackgroundColor="#404040"
app:cardCornerRadius="8dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/default_space_1_5">

<TextView
android:id="@+id/activity_main_distance_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Distance: 100 cm"
android:textColor="#e6e6e6"
android:textSize="@dimen/text_size_xxl" />

<android.support.v7.widget.AppCompatSeekBar
android:id="@+id/activity_main_distance_seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_space"
android:max="100" />

</LinearLayout>

</android.support.v7.widget.CardView>

<android.support.v7.widget.CardView
android:layout_width="280dp"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:cardBackgroundColor="#404040"
app:cardCornerRadius="8dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/default_space_1_5">

<TextView
android:id="@+id/activity_main_speed_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Speed: 100 %"
android:textColor="#e6e6e6"
android:textSize="@dimen/text_size_xxl" />

<android.support.v7.widget.AppCompatSeekBar
android:id="@+id/activity_main_speed_seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_space"
android:max="150" />

</LinearLayout>

</android.support.v7.widget.CardView>

<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:cardBackgroundColor="#404040"
app:cardCornerRadius="8dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/default_space_1_5">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Mode"
android:textColor="#e6e6e6"
android:textSize="@dimen/text_size_xl" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Shape of U"
android:textColor="#b0b0b0"
android:textSize="@dimen/text_size_l" />

</LinearLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

Expand Down
26 changes: 26 additions & 0 deletions app/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="toolbar_height">52dp</dimen>
<dimen name="toolbar_height_2">104dp</dimen>

<!-- Default values -->
<dimen name="default_space_quart">2dp</dimen>
<dimen name="default_space_half">4dp</dimen>
<dimen name="default_space">8dp</dimen>
<dimen name="default_space_1_5">16dp</dimen>
<dimen name="default_space_2">24dp</dimen>
<dimen name="default_space_3">32dp</dimen>
<dimen name="default_space_4">40dp</dimen>
<dimen name="default_space_5">48dp</dimen>
<dimen name="default_radius">2dp</dimen>
<dimen name="default_radius_2">4dp</dimen>

<dimen name="text_size_xs">10sp</dimen>
<dimen name="text_size_s">11sp</dimen>
<dimen name="text_size_m">12sp</dimen>
<dimen name="text_size_l">14sp</dimen>
<dimen name="text_size_l_5">16sp</dimen>
<dimen name="text_size_xl">18sp</dimen>
<dimen name="text_size_xxl">22sp</dimen>
<dimen name="text_size_xxxl">26sp</dimen>
</resources>
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
ext.kotlin_version = '1.2.31'
ext.kotlin_version = '1.2.40'
ext.kotlin_coroutines_version = '0.22.5'
ext.support_version = '27.1.1'
repositories {
Expand Down
3 changes: 2 additions & 1 deletion soundsystem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ android {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.google.android.exoplayer:exoplayer-core:r2.4.4"
}
Binary file not shown.
1 change: 0 additions & 1 deletion soundsystem/src/main/assets/shape_of_you_steps.json

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.mercandalli.android.sdk.soundsystem

interface Player {

val audioSessionId: Int

val isPlaying: Boolean

val duration: Long

val currentPosition: Int

fun load(path: String)

fun play()

fun pause()

fun stop()

fun release()

fun getPitch():Float

fun getSpeed():Float

/**
* Sets the audio volume, with 0 being silence and 1 being unity gain.
*
* @param volume The audio volume.
*/
fun setVolume(volume: Float)

/**
* The factor by which playback will be sped up.
*/
fun setSpeed(speed: Float)

/**
* The factor by which the audio pitch will be scaled.
*/
fun setPitch(pitch: Float)

fun seekTo(ms: Long)

fun registerListener(listener: PlayerListener)

fun unregisterListener(listener: PlayerListener)

interface PlayerListener {

fun onComplete(player: Player)

fun onPrepare(player: Player)

fun onError(player: Player)

fun onBufferingStart(player: Player)

fun onBufferingComplete(player: Player)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.mercandalli.android.sdk.soundsystem

import android.content.Context
import com.google.android.exoplayer2.DefaultRenderersFactory
import com.google.android.exoplayer2.ExoPlayerFactory
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.util.Util

class PlayerProvider {
companion object {

@JvmStatic
fun create(context: Context): Player {
val renderersFactory = DefaultRenderersFactory(
context,
null,
DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF)
val simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, DefaultTrackSelector())
val dataSourceFactory = DefaultDataSourceFactory(
context,
Util.getUserAgent(context, "MusicPlayer"))
return SimpleExoPlayerWrapper(
simpleExoPlayer,
dataSourceFactory)
}
}

}
Loading

0 comments on commit b297dec

Please sign in to comment.