problem with a circular audio player in wordpress

I made this circular audio player of which I enclose the code below, it works perfectly and it’s what I wanted to make for my site, but I noticed that from iphone there are compatibility problems and it doesn’t start correctly as it should, I also leave the link to consult one, how can I solve it ? is there a way to add something to the code to make it work from iPhone ?

html code inline wordpress page:

<div id="playerContainer3"></div>

<script>
  // settings
var DEFAULTS = {
    borderColor: "#de6a5a",
    playedColor: "#ffff",
    backgroundColor: "rgba(142,187,196,.1)",
    iconColor: "#de6a5a",
    borderWidth: 1,
    size: 20,
    className: 'circle-audio-player'
};

// reused values
var pi = Math.PI;
var doublePi = pi * 2;
var arcOffset = -pi / 2;
var animTime = 200;
var loaderTime = 1800;

var CircleAudioPlayer3 = function (options) {
    options = options || {};
    for (var property in DEFAULTS) {
        this[property] = options[property] || DEFAULTS[property];
    }

    // create some things we need
    this._canvas = document.createElement('canvas');
    this._canvas.setAttribute('class', this.className + ' is-loading');
    this._canvas.addEventListener('mousedown', (function () {
        if (this.playing) {
            this.pause();
        }
        else {
            this.play();
        }
    }).bind(this));
    this._ctx = this._canvas.getContext('2d');

    // set up initial stuff
    this.setAudio(options.audio);
    this.setSize(this.size);

    // redraw loop
    (function cAPAnimationLoop (now) {
        // check if we need to update anything
        if (this.animating) {
            this._updateAnimations(now);
        }
        if (this._forceDraw || this.playing || this.animating || this.loading) {
            this._draw();
            this._forceDraw = false;
        }

        requestAnimationFrame(cAPAnimationLoop.bind(this));
    }).call(this, new Date().getTime());
};
CircleAudioPlayer3.prototype = {
    // private methods
    _animateIcon: function (to, from) {
        // define a few things the first time
        this._animationProps = {
            animStart: null,
            from: from,
            to: to
        };
        if (from) {
            this.animating = true;
        }
        else {
            this._animationProps.current = this._icons[to].slice();
            this.draw();
        }
    },
    _updateAnimations: function (now) {
        this._animationProps.animStart = this._animationProps.animStart || now;
        var deltaTime = now - this._animationProps.animStart;
        var perc = (1 - Math.cos(deltaTime / animTime * pi / 2));
        if (deltaTime >= animTime) {
            this.animating = false;
            perc = 1;
            this._animationProps.current = this._icons[this._animationProps.to].slice();
            this.draw();
        }
        else {
            var from = this._icons[this._animationProps.from];
            var current = [];
            for (var i = 0; i < from.length; i++) {
                current.push([]);
                for (var j = 0; j < from[i].length; j++) {
                    current[i].push([]);
                    var to = this._icons[this._animationProps.to][i][j];
                    current[i][j][0] = from[i][j][0] + (to[0] - from[i][j][0]) * perc;
                    current[i][j][1] = from[i][j][1] + (to[1] - from[i][j][1]) * perc;
                }
            }
            this._animationProps.current = current;
        }
    },
    _draw: function (progress) {
        // common settings
        if (isNaN(progress)) {
            progress = this.audio.currentTime / this.audio.duration || 0;
        }

        // clear existing
        this._ctx.clearRect(0, 0, this.size, this.size);

        // draw bg
        this._ctx.beginPath();
        this._ctx.arc(this._halfSize, this._halfSize, this._halfSize - (this.borderWidth / 2), 0, doublePi);
        this._ctx.closePath();
        this._ctx.fillStyle = this.backgroundColor;
        this._ctx.fill();

        // draw border
        // our active path is already the full circle, so just stroke it
        this._ctx.lineWidth = this.borderWidth;
        this._ctx.strokeStyle = this.borderColor;
        this._ctx.stroke();

        // play progress
        if (progress > 0) {
            this._ctx.beginPath();
            this._ctx.arc(this._halfSize, this._halfSize, this._halfSize - (this.borderWidth / 2), arcOffset, arcOffset + doublePi * progress);
            this._ctx.strokeStyle = this.playedColor;
            this._ctx.stroke();
        }

        // icons
        this._ctx.fillStyle = this.iconColor;
        if (this.loading) {
            var loaderOffset = -Math.cos((new Date().getTime() % (loaderTime)) / (loaderTime) * pi) * doublePi - (pi / 2) - (pi / 2);
            this._ctx.beginPath();
            this._ctx.arc(this._halfSize, this._halfSize, this._halfSize / 3, loaderOffset, loaderOffset + pi / 3 * 2);
            this._ctx.strokeStyle = this.iconColor;
            this._ctx.stroke();
        }
        else {
            this._ctx.beginPath();
            var icon = (this._animationProps && this._animationProps.current) || this._icons.play;
            for (var i = 0; i < icon.length; i++) {
                this._ctx.moveTo(icon[i][0][0], icon[i][0][1]);

                for (var j = 1; j < icon[i].length; j++) {
                    this._ctx.lineTo(icon[i][j][0], icon[i][j][1]);
                }
            }

            // this._ctx.closePath();
            this._ctx.fill();
            // stroke to fill in for retina
            this._ctx.strokeStyle = this.iconColor;
            this._ctx.lineWidth = 2;
            this._ctx.lineJoin = 'miter';
            this._ctx.stroke();
        }
    },
    _setState: function (state) {
        this.playing = false;
        this.loading = false;
        if (state === 'playing') {
            this.playing = true;
            this._animateIcon('pause', 'play');
        }
        else if (state === 'loading') {
            this.loading = true;
        }
        else if (this.state !== 'loading') {
            this._animateIcon('play', 'pause');
        }
        else {
            this._animateIcon('play', null);
        }
        this.state = state;
        this._canvas.setAttribute('class', this.className + ' is-' + state);
        this.draw();
    },
    // public methods
    draw: function () {
        this._forceDraw = true;
    },
    setSize: function (size) {
        this.size = size;
        this._halfSize = size / 2; // we do this a lot. it's not heavy, but why repeat?
        this._canvas.width = size;
        this._canvas.height = size;
        // set icon paths
        var iconSize = this.size / 4;
        var pauseGap = iconSize / 10;
        var playLeft = Math.cos(pi / 3 * 2) * (iconSize / 2) + this._halfSize;
        var playRight = iconSize / 2 + this._halfSize;
        var playHalf = (playRight - playLeft) / 2 + playLeft;
        var top = this._halfSize - Math.sin(pi / 3 * 2) * (iconSize / 2);
        var bottom = this.size - top;
        var pauseLeft = this._halfSize - iconSize / 3;
        var pauseRight = this.size - pauseLeft;
        this._icons = {
            play: [
                [
                    [playLeft, top],
                    [playHalf, (this._halfSize - top) / 2 + top],
                    [playHalf, (this._halfSize - top) / 2 + this._halfSize],
                    [playLeft, bottom]
                ],
                [
                    [playHalf, (this._halfSize - top) / 2 + top],
                    [playRight, this._halfSize],
                    [playRight, this._halfSize],
                    [playHalf, (this._halfSize - top) / 2 + this._halfSize]
                ]
            ],
            pause: [
                [
                    [pauseLeft, top + pauseGap],
                    [this._halfSize - pauseGap, top + pauseGap],
                    [this._halfSize - pauseGap, bottom - pauseGap],
                    [pauseLeft, bottom - pauseGap]
                ],
                [
                    [this._halfSize + pauseGap, top + pauseGap],
                    [pauseRight, top + pauseGap],
                    [pauseRight, bottom - pauseGap],
                    [this._halfSize + pauseGap, bottom - pauseGap]
                ]
            ]
        };

        if (this._animationProps && this._animationProps.current) {
            this._animateIcon(this._animationProps.to);
        }
        if (!this.playing) {
            this.draw();
        }
    },
    setAudio: function (audioUrl) {
        this.audio = new Audio(audioUrl);
        this._setState('loading');

        this.audio.addEventListener('canplaythrough', (function () {
            this._setState('paused');
        }).bind(this));
        this.audio.addEventListener('play', (function () {
            this._setState('playing');
        }).bind(this));
        this.audio.addEventListener('pause', (function () {
            // reset when finished
            if (this.audio.currentTime === this.audio.duration) {
                this.audio.currentTime = 0;
            }
            this._setState('paused');
        }).bind(this));
    },
    appendTo: function (element) {
        element.appendChild(this._canvas);
    },
    play: function () {
        this.audio.play();
    },
    pause: function () {
        this.audio.pause();
    }
};


// now init one as an example
var cap = new CircleAudioPlayer3({
    audio: 'https://brandmozart.com/wp-content/uploads/2023/07/5-Il-setaccio.mp3',
  size: 50,
  borderWidth: 2
});
cap.appendTo(playerContainer3);
</script>
type here

css code for element html:

.circle-audio-player {
  display: block;
  margin: 0px;
  cursor: pointer;
}
#playerContainer3 {
  padding: 0px;
}

link to example audio player circular:

https://brandmozart.com/hotel/

img player audio:

I have already tried a few solutions but I can’t get it to run correctly on the iphone, if you can help me solve this problem, thanks