Improve casting resume behavior
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build on Push and create Release on Tag / build (push) Successful in 15m49s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build on Push and create Release on Tag / build (push) Successful in 15m49s
				
			This commit is contained in:
		
							parent
							
								
									150348c391
								
							
						
					
					
						commit
						4cf9a2a58f
					
				
					 3 changed files with 57 additions and 11 deletions
				
			
		|  | @ -39,16 +39,10 @@ func (c *Controller) StartCasting(selected string, mediaURL string) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err := c.Model.ConnectToDevice(selected) |  | ||||||
| 	if err != nil { |  | ||||||
| 		c.LogAndShowError(fmt.Errorf("error connecting to device %v", err)) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	go func() { | 	go func() { | ||||||
| 		err = c.Model.StartCast(mediaURL) | 		err := c.Model.Cast(selected, mediaURL) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			c.LogAndShowError(fmt.Errorf("error starting cast %v", err)) | 			c.LogAndShowError(fmt.Errorf("error starting cast: %v", err)) | ||||||
| 			c.DiscoverDevices() |  | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
|  | @ -56,6 +50,10 @@ func (c *Controller) StartCasting(selected string, mediaURL string) { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Controller) ShowReconnecting(reconnecting bool) { | ||||||
|  | 	c.View.PopupReconnecting(reconnecting) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Note: these are app codes, they are NOT related to fcast opcodes! | // Note: these are app codes, they are NOT related to fcast opcodes! | ||||||
| const ( | const ( | ||||||
| 	ActionPlay        = 0 | 	ActionPlay        = 0 | ||||||
|  | @ -78,7 +76,6 @@ func (c *Controller) PlayerAction(action int, args ...float32) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *Controller) ExitCasting() { | func (c *Controller) ExitCasting() { | ||||||
| 	c.PlayerAction(ActionStop) |  | ||||||
| 	c.DiscoverDevices() | 	c.DiscoverDevices() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								app/model.go
									
										
									
									
									
								
							
							
						
						
									
										32
									
								
								app/model.go
									
										
									
									
									
								
							|  | @ -7,6 +7,8 @@ import ( | ||||||
| 	"io" | 	"io" | ||||||
| 	"math" | 	"math" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Model struct { | type Model struct { | ||||||
|  | @ -14,9 +16,11 @@ type Model struct { | ||||||
| 	DiscoveredDevices []fcast.DiscoveredHost | 	DiscoveredDevices []fcast.DiscoveredHost | ||||||
| 	Connection        *fcast.Connection | 	Connection        *fcast.Connection | ||||||
| 	EventManager      *fcast.EventManager | 	EventManager      *fcast.EventManager | ||||||
|  | 	DeviceName        string | ||||||
| 	Time              float32 | 	Time              float32 | ||||||
| 	Length            float32 | 	Length            float32 | ||||||
| 	Volume            float32 | 	Volume            float32 | ||||||
|  | 	IsReconnecting    bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *Model) DiscoverDevices() ([]string, error) { | func (m *Model) DiscoverDevices() ([]string, error) { | ||||||
|  | @ -47,10 +51,29 @@ func (m *Model) ConnectToDevice(name string) error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	m.Connection = connection | 	m.Connection = connection | ||||||
|  | 	m.DeviceName = name | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *Model) StartCast(mediaURL string) error { | func (m *Model) Cast(selectedDevice, mediaURL string) error { | ||||||
|  | 	err := m.doCast(selectedDevice, mediaURL) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if errors.Is(err, io.EOF) || strings.Contains(err.Error(), "software caused connection abort") { | ||||||
|  | 			m.Controller.ShowReconnecting(true) | ||||||
|  | 			time.Sleep(500 * time.Millisecond) | ||||||
|  | 			return m.Cast(selectedDevice, mediaURL) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	m.Controller.ShowReconnecting(false) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Model) doCast(selectedDevice, mediaURL string) error { | ||||||
|  | 
 | ||||||
|  | 	err := m.ConnectToDevice(selectedDevice) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("error connecting to device %v", err) | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	m.EventManager = &fcast.EventManager{} | 	m.EventManager = &fcast.EventManager{} | ||||||
| 
 | 
 | ||||||
|  | @ -81,6 +104,13 @@ func (m *Model) StartCast(mediaURL string) error { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  | 	} else { | ||||||
|  | 		m.Volume = 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = m.Connection.SendMessage(&fcast.PingMessage{}) | ||||||
|  | 	if err == nil { | ||||||
|  | 		m.Controller.ShowReconnecting(false) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return m.Connection.ListenForMessages(m.EventManager) | 	return m.Connection.ListenForMessages(m.EventManager) | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								app/view.go
									
										
									
									
									
								
							
							
						
						
									
										21
									
								
								app/view.go
									
										
									
									
									
								
							|  | @ -18,10 +18,29 @@ type View struct { | ||||||
| 	Controller            *Controller | 	Controller            *Controller | ||||||
| 	Window                fyne.Window | 	Window                fyne.Window | ||||||
| 	CastingScreenElements CastingScreenElements | 	CastingScreenElements CastingScreenElements | ||||||
|  | 	ReconnectingDialog    *dialog.CustomDialog | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (v *View) PopupError(err error) { | func (v *View) PopupError(err error) { | ||||||
| 	dialog.ShowError(err, v.Window) | 	fyne.Do(func() { | ||||||
|  | 		dialog.ShowError(err, v.Window) | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (v *View) PopupReconnecting(show bool) { | ||||||
|  | 	if v.ReconnectingDialog != nil && !show { | ||||||
|  | 		fyne.DoAndWait(func() { | ||||||
|  | 			v.ReconnectingDialog.Dismiss() | ||||||
|  | 			v.ReconnectingDialog = nil | ||||||
|  | 		}) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if v.ReconnectingDialog == nil && show { | ||||||
|  | 		v.ReconnectingDialog = dialog.NewCustomWithoutButtons("Reconnecting to stream...", widget.NewProgressBarInfinite(), v.Window) | ||||||
|  | 		fyne.Do(func() { | ||||||
|  | 			v.ReconnectingDialog.Show() | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewView(controller *Controller) *View { | func NewView(controller *Controller) *View { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue